本问题已经有最佳答案,请猛点这里访问。
我不明白为什么这个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
}
显然,我没有在控制台中看到两条打印线,而且Web服务的答案是400 Bad request
如果我在curl和代码中更改动词(POST而不是GET),结果就可以了,一切正常。
为什么?
我不能使用GET传递数据吗? 如果你考虑一下,我不会修改内容,我只是接收数据,所以GET应该是最好的REST翻译。
您可以发送带有GET请求的正文,但它不能有任何语义;它应该基本上被忽略。不这样做违反了HTTP / 1.1规范。我建议避免这种做法,因为没有人希望请求体具有GET请求。
现在我不确定你使用的MVC框架是否更严格,因为它会自动拒绝与正文发送的任何GET请求,因为通常服务器可以接受带有正文的GET请求,但是只是应该忽略它。
因此,你所做的不是RESTful。通过GET传递数据的唯一方法是通过查询参数。
UPDATE
这是对您的评论的回应。
您可以公开名为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值)。完成后,返回带有Location标题的303 See Other,其中包含指向搜索结果的链接(可能类似于/searchResults/4334,其中4334是此特定结果的ID)。然后,客户端可以访问此URI以检索搜索结果。如果客户端请求已过期的搜索结果(即服务器因TTL已过期而将其清除),则服务器应以410 Gone响应。
另请阅读此内容以获取更多指示。
好吧但如果我想在我的Web服务中建立一个查询是JSON的研究函数,那么POST听起来并不真正RESTful。 你会建议通过查询参数传递整个JSON吗?
@BlacK你真的需要JSON来传递过滤条件吗? 除了匹配之外,你需要传递哪些字段? 否则我只会说?first=james。
@BlacK你可以简单地传入字段?firstName=james,例如。 但是,如果您想处理更复杂的查询,请查看此问题的一些解决方案。
问题是这个Web服务必须能够处理Elasticsearch查询。 Elasticsearch的强大之处在于您可以存储您的数据模式。 因此,如果我使用JSON符号,我将能够拥有良好的活力水平。
@BlacK查看我的编辑。
您使用的语法似乎有一个拼写错误。请尝试使用下面的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
-XGET应该有用。
-XGET肯定有效:)