[Java] feignclient如何支持第三方application/x-www-form-urlencoded的接口


第三方接口,只支持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!

 

 

 

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM