gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:47:32 26 4
gpt4 key购买 nike

我不明白为什么这个 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 Bad request

如果我更改curl和代码中的动词(POST而不是GET),结果就很好,一切都按预期进行。

为什么?

我不能使用 GET 传递数据吗?如果您考虑一下,我不会修改内容,我只是接收数据,因此 GET 应该是最 RESTful 的翻译。

最佳答案

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

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

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

更新

这是对您的评论的回应。

您可以公开名为 searchResultsearch 的显式资源。要创建 searchResultsearch 资源实例,您需要传入一个本质上是查询的正文。如果您使用语义媒体类型(为了正确的 REST 性,您应该这样做),您的搜索结果资源可能具有媒体类型 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 header ,其中包含指向搜索结果的链接(可能类似于 /searchResults/4334,其中 4334 是此特定结果的 ID)。然后,客户端可以访问此 URI 以检索搜索结果。如果客户端请求的搜索结果已过期(即服务器因 TTL 过期而将其清理),则服务器应使用 410 Gone 进行响应。

另请阅读this以获得更多指导。

关于java - Java 中的 RESTful Web 服务 - 400 错误请求 - 方法调用错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29042025/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com