Java中的RESTful Web服务 - 400错误的请求 - 错误的方法调用?

时间:2015-03-13 21:11:56

标签: java json web-services rest

我不明白为什么这个 curl 调用给了我一个400错误的请求。

curl -v -XGET -H "Content-Type:application/json" -d '{"match":{"first":"james"}}' http://localhost:8080/geocon/search/

认为这是应该处理所有事情的代码部分

@Path(Paths.SEARCH)
public class SearchService {    

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public String search(@DefaultValue(NO_TYPE) @QueryParam("type") String type, String query) {
        // do interesting stuff with the query
        System.out.println(type);
        System.out.println(query);
      return //the result of the query
   }

显然,我没有在控制台中看到两条打印行,而网络服务的回答是 400错误请求

如果我更改curl和代码中的动词( POST 而不是 GET ),结果就可以了,一切正常。

为什么吗

我不能使用GET传递数据吗?如果你考虑一下,我不会修改内容,我只是接收数据,所以GET应该是最好的REST翻译。

2 个答案:

答案 0 :(得分:1)

您可以发送包含GET请求的正文,但必须具有任何语义;它应该基本上被忽略。不这样做违反了HTTP / 1.1规范。我建议避免这种做法,因为没有人希望请求机构有GET请求。

现在我不确定您使用的MVC框架是否更严格,因为它会自动拒绝与正文发送的任何GET请求,因为通常服务器可以接受带有正文的GET请求,但是应该忽略它。

因此,您正在做的不是RESTful 。您可以通过GET传递数据的唯一方法是通过查询参数。

<强>更新

这是对你的评论的回应。

您可以公开名为searchResultsearch的显式资源。要创建searchResultsearch资源实例,您需要传入一个本质上是查询的主体。如果您正在使用语义媒体类型(正如您应该使用正确的RESTful),则搜索结果资源可以具有媒体类型application/vnd.myservice.search-result+json,并且查询可以具有媒体类型application/vnd.myservice.search-query+json。然后,您可以POST/searchResults发出包含复杂查询的请求正文的请求。响应的媒体类型为application/vnd.myservice.search-result+json,它可以包含搜索结果。

那怎么玩呢?搜索查询进来,您解析正文并运行查询。然后你应该坚持结果(不是永远;给它一些理智的TTL值)。完成后,您会返回303 See Other,其中Location标题包含指向搜索结果的链接(可能类似于/searchResults/4334,其中4334是ID这个特殊的结果)。然后,客户端可以访问此URI以检索搜索结果。如果客户端请求已过期的搜索结果(即服务器因TTL已过期而将其清除),则服务器应使用410 Gone进行响应。

另请阅读this以获取更多指示。

答案 1 :(得分:0)

您使用的语法似乎有拼写错误。请尝试使用以下版本的json和xml格式。 -XGET错了。它应该是-X GET。

对于xml curl -H "Accept: application/xml" -H "Content-Type: application/xml" -X GET http://hostname/resource

对于JSON

curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X GET http://hostname/resource