FeignがGetリクエストを送信する場合,POJOオブジェクト伝達パラメータを用いた最終ソリューション

2707 ワード

転載先:https://blog.csdn.net/f641385712/article/details/82431502
について述べる
Spring cloudテクノロジースタックでは、Feignはrest呼び出しとローカルメソッドの呼び出しを同じように便利にすることができます.しかし、それは本当に多くの穴があって、苦しみは言うまでもありません.ここでは、最もよく遭遇するピットについて説明します.
異常
FeignがGetリクエストを送信する場合、POJO伝達パラメータを採用し、異常を報告する
Request method ‘POST’ not supported
@FeignClient("microservice-provider-user")
public interface UserFeignClient {

  @RequestMapping(value = "/user", method = RequestMethod.GET)
  public PageBean get(User user);
  
}
feign.FeignException: status 405 reading UserFeignClient#get0(User); content:
{"timestamp":1482676142940,"status":405,"error":"Method Not Allowed", "exception":"org.springframework.web.HttpRequestMethodNotSupportedException","message":"Request method 'POST' not supported","path":"/user"}

そこで行ごとにデバッグを始め、feignのソースコードからこれを見つけたことを知りました.
private synchronized OutputStream getOutputStream0() throws IOException {
  try {
      if(!this.doOutput) {
            throw new ProtocolException("cannot write to a URLConnection if doOutput=false - call setDoOutput(true)");
 } else {
      if(this.method.equals("GET")) {
           this.method = "POST";
 }

このコードはHttpURLConnectionで発見されたもので、jdkオリジナルのhttp接続リクエストツールクラスは、Feignがデフォルトで使用している接続ツール実装クラスのため、bodyボディオブジェクトがあればgetリクエストをPOSTリクエストに強制的に変換することがわかります.
最後に述べたように、これもfeignのせいではなく、HttpURLConnectionの問題です.だからこれからHttpClientに変えてみるつもりなので、ベンリーはapacheのHttpClientを採用します.しかし、必ず、以下の手順を加える必要があります.
ヒューズをオンにし、HttpURLConnectionをHttpClientに置き換えます.
#        , feign       
feign:
  #      
  hystrix:
    enabled: true
  # httpclient    HttpURLConnection
  httpclient:
    enabled: true

依存にapacheのhttpclientを導入する

 org.apache.httpcomponents
 httpclient
 4.5.3


feign-httpclientの有効化

    com.netflix.feign
    feign-httpclient
    8.15.0

feignの変更
@GetMapping(value = "/queryAllEquipments", consumes = MediaType.APPLICATION_JSON_VALUE)

PageBean queryAllEquipments(
    @RequestHeader(value = "Authorization") String token, 
    @RequestBody QueryAllEquipmentsVO vo
);

注意ここのconsumes=MediaType.APPLICATION_JSON_VALUE
これは、リクエストデータフォーマットをアプリケーション/jsonに設定し、feignのデフォルトフォーマットをtext/htmlにする必要があります.書かないとリクエストが失敗してnullに戻されます