问题:
在开发中,A项目需要在后端调用B项目的接口。B项目原来的参数接收都是在httpServletRequest里面,如下图,
现在在A项目中用 FeignClient 的方式去调用B项目接口,发现相应的搜索参数在B项目中都接收不到。参考了各位大神的代码,在此做一下记录。
解决方案:
在 客户端 添加 feign 配置,代码如下:
@Configuration
public class FeignConfiguration {
private Logger logger = LoggerFactory.getLogger(FeignConfiguration.class);
@Bean
public RequestInterceptor requestInterceptor() {
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate template) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
String values = request.getHeader(name);
template.header(name, values);
}
}
Enumeration<String> bodyNames = request.getParameterNames();
StringBuffer body =new StringBuffer();
if (bodyNames != null) {
while (bodyNames.hasMoreElements()) {
String name = bodyNames.nextElement();
String values = request.getParameter(name);
body.append(name).append("=").append(values).append("&");
}
}
if(body.length()!=0) {
body.deleteCharAt(body.length()-1);
template.body(body.toString());
logger.info("feign interceptor body:{}",body.toString());
}
}
};
}
}
在客户端接口调用的时候 不需要传 request对象,B项目直接接收。A项目Service如下:
@FeignClient(url = "${health.url}",name = "healthUrl")
public interface KhyService {
/**
* @return
*/
@RequestMapping(value = "/api/search/merchandise",method = RequestMethod.POST)
JSONObject merchandise();
}
在调用B项目的时候,已经可以从request里面获取到相关参数了。
获取到参数
网友评论