我不明白为什么这个 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翻译。
答案 0 :(得分:1)
您可以发送包含GET
请求的正文,但必须不具有任何语义;它应该基本上被忽略。不这样做违反了HTTP / 1.1规范。我建议避免这种做法,因为没有人希望请求机构有GET
请求。
现在我不确定您使用的MVC框架是否更严格,因为它会自动拒绝与正文发送的任何GET
请求,因为通常服务器可以接受带有正文的GET
请求,但是应该忽略它。
因此,您正在做的不是RESTful 。您可以通过GET
传递数据的唯一方法是通过查询参数。
<强>更新强>
这是对你的评论的回应。
您可以公开名为searchResult
或search
的显式资源。要创建searchResult
或search
资源实例,您需要传入一个本质上是查询的主体。如果您正在使用语义媒体类型(正如您应该使用正确的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