我是Jersey Java REST WebService框架的新手。我正在尝试编写一个消耗和生成JSON的服务方法。我的服务代码如下。它是最简单的代码,仅用于研究目的。
@Path("/myresource")
public class MyResource {
@Path("/sendReceiveJson")
@GET
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String sendReceiveJson(String name)
{
System.out.println("Value in name: " + name);
return "{\"serviceName\": \"Mr.Server\"}";
}
}
以下是JerseyClient代码。
public class Program {
public static void main(String[] args) throws Exception{
String urlString="http://localhost:8080/MyWebService/webresources/myresource/sendReceiveJson";
URL url=new URL(urlString);
URLConnection connection=url.openConnection();
connection.setDoOutput(true);
OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
out.write("{\"clientName\": \"Mr.Client\"}");
out.close();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String decodedString;
while ((decodedString = in.readLine()) != null) {
System.out.println(decodedString);
}
in.close();
}
}
但是当我运行服务然后运行客户端时,我无法发送/接收JSON数据。我在connection.getInputStream()
得到了例外
Server returned HTTP response code: 405 for URL: http://localhost:8080/hellointernet/webresources/myresource/sendReceiveJson
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1625)
请指导我,需要纠正什么,或者我是否在错误的方向。
答案 0 :(得分:1)
您的资源方法注释为@GET,这意味着任何输入数据都必须是查询字符串参数。
在这种情况下,@ Consumes(MediaType.APPLICATION_JSON)没有多大意义,因为只有通过GET支持APPLICATION_FORM_URLENCODED。
当客户端调用setDoOutput(true)时,它可能会将您的HTTP调用切换为POST,从而导致405方法不允许。
如果您想使用JSON,则应使用@POST更改@GET注释。如果确实是POST,那么您的客户呼叫应该可以正常工作。您可以使用以下方法指定它:
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
httpCon.setDoOutput(true);
httpCon.setRequestMethod("POST");
这个API虽然很低,所以我强烈建议您使用Jersey的Client API。见https://jersey.java.net/documentation/1.17/client-api.html