在Jersey Java中向REST WebService发送和接收JSON

时间:2013-09-27 12:21:01

标签: java web-services rest jersey jersey-client

我是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)

请指导我,需要纠正什么,或者我是否在错误的方向。

1 个答案:

答案 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