springCloud 使用feign復制請求頭調用其他服務 content-length不一致導致調用失敗


背景:目前需要前端需要從B系統中獲取數據,請求先發送到A系統,然后由A系統使用Feign調用B系統的接口,由於調用B系統時需要將請求的用戶相關信息一起帶到B系統,所以是用的Feign的請求攔截對其進行請求頭復制

以下是請求頭復制的攔截器

package cn.rivamed.hvc.filter;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 描述: TODO
 * 公司 北京瑞華康源科技有限公司
 * 版本 rivamed2019
 *
 * @version V2.0.1
 * @author: 左健宏
 * @date: 2019-12-20 13:08
 */
@Configuration
public class FeginInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        try {
            Map<String,String> headers = getHeaders();
            for(String headerName : headers.keySet()){
                requestTemplate.header(headerName, headers.get(headerName));
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    private Map<String, String> getHeaders(){
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        Map<String, String> map = new LinkedHashMap<>();
        Enumeration<String> enumeration = request.getHeaderNames();
        while (enumeration.hasMoreElements()) {
            String key = enumeration.nextElement();
            String value = request.getHeader(key);
//            if ("content-length".equals(key)) {
//                continue;
//            }
            map.put(key, value);
        }
        return map;
    }

}

該攔截器復制了所有請求頭,包括content-length(重點),最初浮現的問題是

 

 

 在postMan寫入的json不規范導致請求B系統報錯

org.springframework.http.converter.HttpMessageNotReadableException: I/O error while reading input message; nested exception is org.apache.catalina.connector.ClientAbortException: java.io.EOFException: Unexpected EOF read on the socket

如果規范就沒問題

 

 

 經過多次踩坑才知道特喵的 content-length是由body里面字符數控制的

 

所以問題明了了,貼上解決后的攔截器

package cn.rivamed.hvc.filter;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 描述: TODO
 * 公司 北京瑞華康源科技有限公司
 * 版本 rivamed2019
 *
 * @version V2.0.1
 * @author: 左健宏
 * @date: 2019-12-20 13:08
 */
@Configuration
public class FeginInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        try {
            Map<String,String> headers = getHeaders();
            for(String headerName : headers.keySet()){
                requestTemplate.header(headerName, headers.get(headerName));
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    private Map<String, String> getHeaders(){
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        Map<String, String> map = new LinkedHashMap<>();
        Enumeration<String> enumeration = request.getHeaderNames();
        while (enumeration.hasMoreElements()) {
            String key = enumeration.nextElement();
            String value = request.getHeader(key);
            if ("content-length".equals(key)) {
                continue;
            }
            map.put(key, value);
        }
        return map;
    }

}

content-length詳解參考文章 :https://juejin.im/post/5d772cb4e51d453b5f1a0502


免責聲明!

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



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