我先说:我做错了。这就是我做错了什么。
我创建了一个 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 资源吗?