3

REST Webサービスでcreateメソッドを編集しようとしているので、オブジェクトから新しく作成されたIDが返されます。私は過去2日間努力してきましたが、ひどく間違ったことをしているに違いありません...

これは、サーバー側で編集されたcreateメソッドです。

@POST
@Consumes({"application/xml", "application/json"})
@Path("withID")
@Produces("text/plain")
public String create2(Users entity) {
    getEntityManager().persist(entity);
    getEntityManager().flush();
    System.out.println("new id: " + entity.getId());
    return String.valueOf(entity.getId());
}

これは、以下に示すように、(netbeansによって)生成されたcount()メソッドに基づいています。

@GET
@Path("count")
@Produces("text/plain")
public String countREST() {
    return String.valueOf(super.count());
}

クライアントから新しいUsersオブジェクトを追加するように要求すると、期待どおりに機能します。新しいユーザーがデータベースに追加されています。GlassFishサーバーログに、System.out.printlnコマンドによって示される新しく作成されたIDが表示されます。ただし、NetBeansでTestRestful Webサービスを介してテストを実行し、クライアントが生成したXMLコードを正しいウィンドウに貼り付けて、[テスト]ボタンを押すと、HTTPステータス415-サポートされていないメディアタイプエラーが表示されます。

私はいくつかの調査を行い、この質問を見つけました。したがって、文字列を返す代わりに、201 CREATEDステータスのResponseオブジェクトを返し、ヘッダーなどを調整する必要がありますか?springの例を確認しましたが、springを使用していないため、create2メソッドコードを調整する方法がわかりません...ただし、試してみましたが、いくつかの部分が欠落しています。

@POST
@Consumes({"application/xml", "application/json"})
@Path("withID")
@Produces("text/plain") //should this change to application/xml?
public Response create2(Users entity) {
    getEntityManager().persist(entity);
    getEntityManager().flush();
    System.out.println("new id: " + entity.getId());

    //Response response = Response.created(... + "withID/" + entity.getId()); //response need an URI, can I get this through the entity object?

    return Response.status(200).entity(entity.getId().toString()).build();    
}

私は正しい方向に進んでいることを願っています。長い投稿で申し訳ありませんが、誰かがここで私を助けてくれることを願っています。前もって感謝します!

編集:今すぐ作業例:

@POST
@Consumes({"application/xml"})
@Path("withID")
@Produces({"application/xml"})
public Response create2(Users entity) {
    getEntityManager().persist(entity);
    getEntityManager().flush();
    return Response.status(201).entity(entity.getId().toString()).build();
}
4

2 に答える 2

1

NetBeansに関するものについてはわかりませんが、Springを使用しています。ただし、Responseオブジェクトを返すことは良い考えです。常にそれを行い、作成用のIDも返します。

return Response.status(200).entity(createdObject.getId().toString()).build();

サポートされていないMediaTypeは非常に煩わしいです。クライアントが生成したxmlデータについて言及するときに何を話しているのかわかりません。JSONを使用しており、応答は単純な文字列ですが、createメソッドにjsonを生成するように指示します。

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Transactional
public Response create(T source) {
}

コマンドラインで使用する簡単なテスト:

$ curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":95, "additional":"stuff..."}' "http://localhost:8080/rest/resource"

では、頑張ってね。あなたは正しい方向に進んでいるようです。

于 2012-10-19T09:45:54.100 に答える
0

カスタムBLOBを返す代わりに、プロトコルを使用するだけです。

したがって、新しいリソースへのURIを使用した応答でロケーションヘッダーを使用することを検討してください。あなたはRESTサービスを行っているので、もちろんあなたのIDはURIです(右?)。

Jim Webberは、REST inPracticeと呼ばれるRESTWebサービスの設計に関するすばらしい本を書きました。この本では、このような単純な原則に基づいてRESTAPIを設計する方法を詳細に説明しています。

于 2012-10-19T16:20:39.833 に答える