現在、DropWizardベースのREST APIアプリケーションに対して単体テストを作成しています。私がテストしているエンドポイントには、オブジェクトのプロパティを追加したり削除したりする2つのメソッドがあります。 POSTコールはプロパティを作成し、DELETEコールはそれを削除できます。プロパティを識別するフォームデータとともにPOST要求を送信できます。私は、プロパティを識別するフォームデータでDELETEリクエストを送信するのに問題があります。 POSTを送信するには、私は次のものを使用します:HTTP DELETEを使用してJerseyClientBuilderでフォームデータを渡す方法
Client client = new JerseyClientBuilder(RULE.getEnvironment())
.build(String.format("test client %d", _id));
_id++;
return client.target("http://localhost:5000/Object/12345/Property")
.request(MediaType.APPLICATION_JSON_TYPE)
.post(Entity.entity(form,MediaType.APPLICATION_FORM_URLENCODED_TYPE), Response.class);
これは期待どおりに動作します。しかし、JerseyInvocation.BuilderオブジェクトのDELETE関連のメソッドは、フォームパラメータを定義するEntityオブジェクトを渡す方法が不足しているようです。私がしようとすると、下位レベルの.method()関数を使用する場合:
Client client = new JerseyClientBuilder(RULE.getEnvironment()).build(String.format("test client %d", _id));
_id++;
return client.target("http://localhost:5000/Object/12345/Property")
.request(MediaType.APPLICATION_JSON_TYPE)
.method("DELETE",
Entity.entity(form,MediaType.APPLICATION_FORM_URLENCODED_TYPE),
Response.class);
を私は、この徹底的に役に立たない例外受け取る:
java.lang.IllegalStateException: Entity must be null for http method DELETE.
をHTTPの仕様(とstackoverflowの者のコンセンサス:Is an entity body allowed for an HTTP DELETE request?)の私の理解では、ことを示していますDELETEを持つメッセージ本文は標準の範囲内にありますが、実装によってはこれを妨げることを任意に決定しています。ジャージーは限られた実装の一つであるようです。この問題の理想的な最小限の努力の回避策は何でしょうか? (DropWizardアプリケーションが不変であると仮定し、 "単にREST APIをDELETEを使わないように書き換えるか、別のREST URIスキーマを使用する"は役に立ちません)既存の実装に対してテストする必要があります。 「エンティティは、HTTPメソッドDELETEの場合はnullでなければならない」これは、あなたがエラーになった理由である
map.put("DELETE", EntityPresence.MUST_BE_NULL);
: