关于json:Java中的RESTful Web服务 – 400错误的请求 – 错误的方法调用?

RESTful web service in Java - 400 Bad request - Wrong method invocation?

本问题已经有最佳答案,请猛点这里访问。

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
@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
   }

显然,我没有在控制台中看到两条打印线,而且Web服务的答案是400 Bad request

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

为什么?

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


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

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

因此,你所做的不是RESTful。通过GET传递数据的唯一方法是通过查询参数。

UPDATE

这是对您的评论的回应。

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

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

另请阅读此内容以获取更多指示。


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

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

对于JSON

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