2

複数のRESTfulWebサービスメソッドから値を取得しています。この場合、Requestメソッドの問題により、2つのメソッドが互いに干渉します。

@GET
@Path("/person/{name}")
@Produces("application/xml")
public Person getPerson(@PathParam("name") String name) {
    System.out.println("@GET /person/" + name);
    return people.byName(name);
}

@POST
@Path("/person")
@Consumes("application/xml")
public void createPerson(Person person) {
    System.out.println("@POST /person");
    System.out.println(person.getId() + ": " + person.getName());
    people.add(person);
}

次のコードを使用してcreatePerson()メソッドを呼び出そうとすると、Glassfishサーバーの結果は「@GET /person/で人を作成しようとしている名前」になります。これは、{name}パラメーターを送信しなかった場合でも@GETメソッドが呼び出されることを意味します(コードで確認できます)。

URL url = new URL("http://localhost:8080/RESTfulService/service/person");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Accept", "application/xml");
connection.setDoOutput(true);
marshaller.marshal(person, connection.getOutputStream());

私はこれが私のコードを掘り下げることをたくさん求めていることを知っていますが、この場合私は何を間違っているのですか?

アップデート

createPersonはvoidであるため、connection.getInputStream()を処理しません。これにより、実際にはリクエストが私のサービスによって処理されないようになります。

しかし、実際のリクエストはconnection.getOutputStream()で送信されますよね?

更新2

RequestMethodは、戻り値を持つメソッド、つまりconnection.getOutputStream()を処理する限り、機能します。voidを呼び出して、connection.getOutputStream()を処理しようとしないと、サービスは要求を受信しません。

4

1 に答える 1

3

「Accept」ヘッダーの代わりに「Content-Type」を設定する必要があります。Content-Typeは受信者に送信されるメディアタイプを指定し、Acceptはクライアントによって受け入れられるメディアタイプに関するものです。ヘッダーの詳細については、こちらをご覧ください。

Javaクライアントは次のとおりです。

public static void main(String[] args) throws Exception {
    String data = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><person><name>1234567</name></person>";
    URL url = new URL("http://localhost:8080/RESTfulService/service/person");
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("POST");
    connection.setRequestProperty("Content-Type", "application/xml");

    connection.setDoOutput(true);
    connection.setDoInput(true);        

    OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream());
    wr.write(data);
    wr.flush();

    // Get the response
    BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    wr.close();
    rd.close();

    connection.disconnect();
}

これはcurlを使用した場合と同じです。

curl -X POST -d @person --header "Content-Type:application/xml" http://localhost:8080/RESTfulService/service/person

、ここで、「person」はxmlを含むファイルです。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><person><name>1234567</name></person>
于 2012-06-06T01:17:08.790 に答える