2016-08-08 4 views
1

現在、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); 

答えて

3

はジャージー2.18バージョンから、クラスJerseyInvocationは、以下のようにHTTPメソッドとそのエンティティを検証するためにHashMapを使います。

注:あなたは残りの部分の実行を停止するか、ジャージーのクライアント構成プロパティClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATIONを提供し、エンティティとDELETEリクエストを送信し続けるために検証を抑制するために下記のコードを追加しnot.Pleaseジャージを指示する必要があります。

ClientConfig clientConfig = new ClientConfig(); 
clientConfig.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true); 
Client client = ClientBuilder.newClient(clientConfig); 
関連する問題