2

私は、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)

何を修正する必要があるか、または間違った方向に進んでいるかどうかを教えてください。

4

1 に答える 1

1

リソース メソッドには @GET という注釈が付けられています。これは、入力データがクエリ文字列パラメーターである必要があることを意味します。

このコンテキストでは、GET 経由でサポートされているのは APPLICATION_FORM_URLENCODED のみであるため、 @Consumes(MediaType.APPLICATION_JSON) はあまり意味がありません。

クライアントが setDoOutput(true) を呼び出すと、HTTP 呼び出しが POST に切り替わるため、405 Method Not Allowed が発生する可能性があります。

JSON を使用する場合は、代わりに @GET アノテーションを @POST に変更する必要があります。実際に 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を参照してください

于 2013-09-27T23:36:03.697 に答える