1

我先说:我做错了。这就是我做错了什么。

我创建了一个 REST 资源来搜索某些东西,并且我期望请求参数中有一个 JSON 数据:

@GET
@Path("/device")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response searchContent(String searchJSONString) {
    String message = new SearchServices().search(searchJSONString);

    return getResponse(message); //Checks the message for any error and sends back the response.
}//end of searchContent()

我不应该写:

@Consumes

因为它是一个 GET 资源并且它不消耗任何东西。但我的问题是如何为此(GET 资源)在 java 代码中发送 JSON 数据。我尝试了 curl 命令,它能够将 JSON 数据发送到此资源,但无论如何都不能发送 java 代码。

我尝试使用 curl 命令向其发送 JSON 数据:

curl -X GET -H "Content-Type: application/json" -d '{"keyword":"hello"}' http://localhost:8080/search-test/rest/search

它工作正常并给我一个正确的 JSON 响应。

但是,如果我使用 curl 命令而不指定任何方法(应该是默认的 http get),我会从 tomcat 收到 405(不允许的方法)响应:

curl -d '{"keyword":"hello"}' http://localhost:8080/search-test/rest/search

或通过 Java 代码:

HttpURLConnection urlConnection = (HttpURLConnection) new URL(urlString).openConnection();
urlConnection.setRequestProperty("Content-Type", "application/json");
urlConnection.setRequestMethod("GET");  //This is not working.

从 tomcat 获得相同的 405(不允许的方法)响应。

如果我使用 java 代码发送 GET 请求,我无法像在 post 方法中那样发送 JSON 数据,我不得不使用 name=value 的东西,为此我需要更改我的 REST 资源以接受它作为名称/值对。

它的意思是这样的:

http://localhost:8080/search-test/rest/search?param={"keyword":"permission"}

如果我在 POST 中做类似的事情:

@POST
@Path("/device")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response searchContent(String searchJSONString) {
    String message = new SearchServices().search(searchJSONString);

    return getResponse(message); //Checks the message for any error and sends back the response.
}//end of searchContent()

我也可以从 Java 代码和 curl 命令发送 JSON 数据:

curl -X POST -H "Content-Type: application/json" -d '{"keyword":"hello"}' http://localhost:8080/search-test/rest/search

或通过 Java 代码:

HttpURLConnection urlConnection = (HttpURLConnection) new URL(urlString).openConnection();
urlConnection.setRequestMethod("POST");  //Works fine.
urlConnection.setRequestProperty("Content-Type", "application/json");
urlConnection.setDoOutput(true);

哪里有问题?为什么我不能从代码发送它,而是从 curl 发送?除了名称=值对之外,还有其他方法可以将 JSON 数据发送到 GET 资源吗?

4

1 回答 1

0

HttpURLConnection 不允许带有实体的 GET 请求,并且会在将实体发送到服务器之前将其从请求中剥离。因此,我强烈建议您避免使用它,因为即使您使用允许您这样做的不同 Java HTTP 客户端库,您的用户也可能会遇到类似的问题(加上 Web 缓存和代理可能会增加更多问题)。

于 2012-07-14T10:39:21.803 回答