2017-06-27 15 views
1

私はApache Http Clientを装うを使用していますが、私は以下のJAX-RSのインタフェースをサポートしたいと思います:リクエストボディとクエリパラメータなしでFeign POSTリクエストを作成するにはどうすればいいですか?

@POST 
@Path("/do_something") 
void doSomething(@QueryParam("arg") String arg); 

しかし、ApacheHttpClientはUrlEncodedFormEntityに身体/実体なしで要求のためのクエリパラメータを変換しRequestBuilderを、使用しています。

私のAPIをjax-rsに変換していますが、下位互換性を壊したくありません。 APIを調整せずにFeignを使用する方法はありますか? OkHttpまたはリボンクライアントは、クエリパラメータを持つPOSTをサポートし、ボディ/エンティティはありませんか?これをサポートする別のjava jax-rsクライアントがありますか?

また、RequestBuilderがクエリパラメータをUrlEncodedFormEntityに変換する理由はありますか?これをしないapache-httpclientライブラリ内に別のHttpUriRequestビルダーがありますか?あなたは少しAPIを破るために喜んでいる場合

URI uri = new URIBuilder() 
     .setScheme("https") 
     .setHost("localhost") 
     .setPath("service/do_something") 
     .addParameter("arg", "value") 
     .build(); 
HttpUriRequest request = new HttpPost(uri); 

答えて

0

:RequestBuilderのビルド方法は、次のコード行があります装うに切り替える前に

if (entity == null && (HttpPost.METHOD_NAME.equalsIgnoreCase(method) || HttpPut.METHOD_NAME.equalsIgnoreCase(method))) { 
    entity = new UrlEncodedFormEntity(parameters, HTTP.DEF_CONTENT_CHARSET); 
} else { 
    // omitted expected behavior 
} 

を、私のコードは次のような何かをHttpUriRequestを構築しましたそして、あなたが要求にプレーンテキストエンティティ/本文を追加し装うクライアント上リクエストインターセプタを定義することができ@QueryParamのサポートを維持する:

.requestInterceptor(template -> { 
    if (template.method().equals(HttpPost.METHOD_NAME) && template.queries().keySet().size() > 0 && template.body() == null) { 
    template.body(" "); 
    } 
}) 

次に、あなたのAPIは、次のように変更します

@POST 
@Consumes(MediaType.TEXT_PLAIN) 
@Path("/do_something") 
void doSomething(@QueryParam("arg") String arg); 

しかし、サーバは今期待するので、これはAPIを壊す/プレーンテキストエンティティ/ボディとPOSTメッセージを消費します。

私は同じことがrequestInterceptorなしと装うの@Bodyテンプレートを使用して達成することができると思う:これはあなたのAPIを装うのではなく、純粋なJAX-RSのアノテーションを含めなければならないことを意味し、

@POST 
@Consumes(MediaType.TEXT_PLAIN) 
@Body(" ") 
@Path("/do_something") 
void doSomething(@QueryParam("arg") String arg); 

しかし。

関連する問題