第三方接口,只支持application/x-www-form-urlencoded的數據提交方式,解決過程比較曲折,記錄一下
解決方案一(后面證實是失敗的,僅供參考)
通過自定義FeignClient的配置類來解決
proxy代碼參考
@ConditionalOnProperty("flan.api.url") @FeignClient(name = "${flan.api.url:}", url = "${flan.api.url:}", path = "/OpenPlatform", configuration = {FeignClientConfig.class, FlanOrderProxy.Configuration.class} ) public interface FlanOrderProxy { @PostMapping(value = "/pushOrderDetail", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) DataResult<Object> push( @RequestHeader Map<String, String> headerMap, @RequestBody Map<String, ?> postData ); @GetMapping("/cancelOrder?order_no={orderNo}") DataResult<Object> cancel( @RequestHeader Map<String, String> headerMap, @PathVariable(value = "orderNo") String orderNo ); class Configuration { @Bean @Primary Encoder feignFormEncoder(ObjectFactory<HttpMessageConverters> converters) { return new SpringFormEncoder(new SpringEncoder(converters)); } } }
解說
client代碼參考
public DataResult<Object> push(StoreSaasFlanOrderPushRequest request) { Map<String, String> postData = new HashMap<>(); postData.put("detail", JSON.toJSONString(request)); return flanOrderProxy.push( FlanApiUtils.assembleHeaders(request.getAuthorization()), postData ); }
解說
代碼就差不多這樣了,本地運行,正常!然后打包上測試環境,死了,老是報這個錯!
Could not write request: no suitable HttpMessageConverter found for request type [java.util.HashMap] and content type [application/x-www-form-urlencoded]
這個錯誤的意思是,proxy類根本就沒有使用到 Configuration這個類去encode數據!也就是說
調試了好久,一開始以為是test的代碼分支有問題,把test分支checkout到本地,也是能正常運行的!沒辦法,只能又google了!
解決方案二
在不斷搜索和嘗試方案之后,終於找到了能解決的方式了!
參考文章: https://blog.csdn.net/rtuujnncc/article/details/91867685
proxy代碼參考
@ConditionalOnProperty("flan.api.url") @FeignClient(name = "${flan.api.url:}", url = "${flan.api.url:}", path = "/OpenPlatform", configuration = {FeignClientConfig.class} ) public interface FlanOrderProxy { @PostMapping(value = "/pushOrderDetail", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) DataResult<Object> push( @RequestHeader Map<String, String> headerMap, @RequestBody MultiValueMap<String, ?> postData ); @GetMapping("/cancelOrder?order_no={orderNo}") DataResult<Object> cancel( @RequestHeader Map<String, String> headerMap, @PathVariable(value = "orderNo") String orderNo ); }
解說
client代碼參考
public DataResult<Object> push(StoreSaasFlanOrderPushRequest request) { MultiValueMap<String, String> postData = new LinkedMultiValueMap<>(); postData.add("detail", JSON.toJSONString(request)); return flanOrderProxy.push( FlanApiUtils.assembleHeaders(request.getAuthorization()), postData ); }
解說
本地運行,正常!測試環境運行,正常!Mission completed!
Have fun with Java & Spring!