业务场景:
B服务调用A服务的接口
A服务中的接口包含 HttpServletRequest request 参数
现象:
直接传递HttpServletRequest request 会报错 无法解析
解决方案
1、B中添加依赖
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>${spring.boot.version}</version>
</dependency>
2、B中启用Feign
@EnableFeignClients({"com.sinux.rock.clients"})
3、在B服务中调用接口
@Component
@FeignClient(value="sinux-simu-socket" ,contextId = "socketClient")
@RequestMapping("/socket/order/")
public interface SocketClient {
@GetMapping("offtask")
BaseResult offTask(@ApiParam(value = "任务号编号", required = true) @RequestParam("taskId") String taskId,
@ApiParam(value = "项目任务名", required = true) @RequestParam("taskName") String taskName
);
@GetMapping("task")
BaseResult startTask(@ApiParam(value = "任务编号", required = true) @RequestParam("taskId") String taskId,
@ApiParam(value = "项目任务名", required = true) @RequestParam("taskName") String taskName);
}
4、添加拦截器
@Configuration
public class FeignConfig implements RequestInterceptor {
/**
* 复写feign请求对象
* @param requestTemplate hhh
*/
@Override
public void apply(RequestTemplate requestTemplate) {
//获取请求头
Map<String,String> headers = getHeaders(Objects.requireNonNull(getHttpServletRequest()));
for(String headerName : headers.keySet()){
requestTemplate.header(headerName, getHeaders(getHttpServletRequest()).get(headerName));
}
}
//获取请求对象
private HttpServletRequest getHttpServletRequest() {
try {
return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
//拿到请求头信息
private Map<String, String> getHeaders(HttpServletRequest request) {
Map<String, String> map = new LinkedHashMap<>();
Enumeration<String> enumeration = request.getHeaderNames();
while (enumeration.hasMoreElements()) {
String key = enumeration.nextElement();
String value = request.getHeader(key);
map.put(key, value);
}
return map;
}
}
A服务的接口
@ApiOperation("结束任务")
@GetMapping("offtask")
public BaseResult offTask(@ApiParam(value = "任务号编号", required = true) @RequestParam("taskId") String taskId,
@ApiParam(value = "项目任务名", required = true) @RequestParam("taskName") String taskName,
HttpServletRequest request
) throws Exception {
return BaseResult.success();
}