springboot 使用 spring cloud feign 過程中,對application/x-www-form-urlencoded 編碼格式 轉發過程碰到的問題。


問題一: springboot 控制器使用 實體 接受 application/x-www-form-urlencoded 編碼格式 的參數

默認接收參數,只能使用@RequestParam Map 或者 @RequestParam("id") Integer id 這樣的參數方式,蛋疼的扣腳
解決方式就是增加 自定義Resolver實現 HandlerMethodArgumentResolver 接口,在resolveArgument 的時候 判定 當前請求的 Content-Type,當為 "application/x-www-form-urlencoded "時, 用ServletModelAttributeMethodProcessor來解析;
代碼如下:

public class XXXXXResolver implements HandlerMethodArgumentResolver {
    private ServletModelAttributeMethodProcessor modelProcessor;
    .
    .
    .
 @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer,
                                  NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory){

        String contentType = request.getContentType();
        if (MediaType.APPLICATION_FORM_URLENCODED_VALUE.equals(contentType)) {
           return servletModelAttributeMethodProcessor.resolveArgument(methodParameter,
                    modelAndViewContainer, nativeWebRequest, webDataBinderFactory);
        }
    }
}

問題二: spring cloud openfeign 傳遞String字符串過長(65534)導致 414 問題

理論上的Post請求是沒長度限制,但是在application/x-www-form-urlencoded中,這個限制還是存在的;
這個坑爹問題,老生常談,你想用實體 去請求完成,在"application/x-www-form-urlencoded" 中就是比較扯淡了, 解決辦法 參數使用 類型 轉換 為 MultiValueMap
至於為什么,就是在於 這個 類型能拼接參數 例如 :a=1&a=2

問題三: openfeign 傳遞 application/x-www-form-urlencoded 收不到參數 的問題

跟問題二有點兒關系 完整請求

@PostMapping(value = "/giaogiaogiaogiao", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
ResponseData logo(@RequestBody MultiValueMap<String, String> data);

都是個人的工作總結經驗,不一定准確,只為了自己的技能積累。


免責聲明!

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



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