FeignがGetリクエストを送信する場合,POJOオブジェクト伝達パラメータを用いた最終ソリューション
2707 ワード
転載先:https://blog.csdn.net/f641385712/article/details/82431502
について述べる
Spring cloudテクノロジースタックでは、Feignはrest呼び出しとローカルメソッドの呼び出しを同じように便利にすることができます.しかし、それは本当に多くの穴があって、苦しみは言うまでもありません.ここでは、最もよく遭遇するピットについて説明します.
異常
FeignがGetリクエストを送信する場合、POJO伝達パラメータを採用し、異常を報告する
Request method ‘POST’ not supported
そこで行ごとにデバッグを始め、feignのソースコードからこれを見つけたことを知りました.
このコードはHttpURLConnectionで発見されたもので、jdkオリジナルのhttp接続リクエストツールクラスは、Feignがデフォルトで使用している接続ツール実装クラスのため、bodyボディオブジェクトがあればgetリクエストをPOSTリクエストに強制的に変換することがわかります.
最後に述べたように、これもfeignのせいではなく、HttpURLConnectionの問題です.だからこれからHttpClientに変えてみるつもりなので、ベンリーはapacheのHttpClientを採用します.しかし、必ず、以下の手順を加える必要があります.
ヒューズをオンにし、HttpURLConnectionをHttpClientに置き換えます.
依存にapacheのhttpclientを導入する
feign-httpclientの有効化
feignの変更
注意ここのconsumes=MediaType.APPLICATION_JSON_VALUE
これは、リクエストデータフォーマットをアプリケーション/jsonに設定し、feignのデフォルトフォーマットをtext/htmlにする必要があります.書かないとリクエストが失敗してnullに戻されます
について述べる
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に戻されます