今天在项目中要调用一个外部项目的接口,使用了Feign,发现被调用方法的参数传递有点特殊,返回数据的类型也不明确。
@FeignClient(name ="fwm",url="http://localhost:9001")//目标调用项目
public interface ISystemFeign {
//①这一类返回的数据类型明确的,Feign接口声明直接将被调用方的方法头复制过来即可
@PostMapping(params = "/ClsInfo.ctrl?method=queryClsInfo")
List<ClsInfoFeignDto> queryClsInfo(@RequestBody ClsFeignDto dto);
//②如果是这一类返回的数据类型并不明确的,可以直接使用String接口,再观察接收到的数据结果随后进行转化处理,下面主要以这个为例
@GetMapping("/ClsInfo.ctrl?method=queryClsInfoByCode")
String queryClsInfoByCode(@RequestParam String srhCode,@RequestParam String state);
}
被调用方这个方法如下,特殊点就在这个方法的入参是request与response,且通过AJAXUtil.success()直接返回数据
//观察此处的HttpServletRequest request、HttpServletResponse response,在Feign中可以直接忽略
@RequestMapping(params = "method=queryClsInfoByCode",method=RequestMethod.GET)//可以直接合并成@GetMapping
public void queryClsInfoByCode(HttpServletRequest request,HttpServletResponse response){
String id = request.getParameter("srhCode");//与Feign接口声明中的参数对应
String checked = request.getParameter("state");//与Feign接口声明中的参数对应
……
//省略对list集合的处理,这个list集合就是通过AJAXUtil.success()返回前端的
AJAXUtil.success(response, (List) JsonConvertUtil.convertAnyKeyWithObject(list,arr), PageUtil.TOTAL);//这样子返回数据,Feign采用String先进行接收
}
顺带看一下AJAXUtil.success()
/**
* 访问成功,向前台发送可分页的数据
* @param response 响应对象
* @param vos 当前页显示的数据
* @param rowTotle 数据总行数
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void success(HttpServletResponse response, Collection<?> vos, int rowTotle) throws SOFARuntimeException {
check2JSONSize(vos);
response.setContentType("text/json;charset=UTF-8");
try {
PrintWriter out = response.getWriter();
Page page = new Page();
page.setTotal(rowTotle);
page.setData(vos);
String msg = JSONObject.toJSONString(page);
out.write(msg);
} catch (IOException ex) {
throw new SOFARuntimeException(ex);
}
}
应用处注入Feign声明,就可以编写后续的业务代码了
@Autowired
private ISystemFeign iSystemFeign;
@Override
public List<ClsInfoDto> queryClsInfo(String srhCode){
List<ClsInfoDto> resList = new ArrayList<>();
String json = iSystemFeign.queryClsInfoByCode(srhCode,"1");//接收到数据之后就明确处理目标了
Object object = JSON.parse(json);
JSONObject obj = (JSONObject) object;
JSONArray data = obj.getJSONArray("data");
resList = JSONArray.parseArray(data.toJSONString(),ClsInfoDto.class);
return resList;
}
再写上控制器,就可以采用postman测试接口了