OpenFeign 调用参数处理(开发重点)
4.1 说在前面
Feign 传参确保消费者和提供者的参数列表一致 包括返回值 方法签名要一致
-
通过 URL 传参数,GET 请求,参数列表使用@PathVariable(“”)
-
如果是 GET 请求,每个基本参数必须加@RequestParam(“”)
-
如果是 POST 请求,而且是对象集合等参数,必须加@Requestbody 或者@RequestParam
4.2 修改 provider-order-service
4.2.1 创建 BaseResult 类
public class BaseResult implements Serializable {
private Integer code;
private String msg;
private Object data;
public static BaseResult success(Integer code, String msg, Object data) {
BaseResult baseResult = new BaseResult();
baseResult.setCode(code);
baseResult.setData(data);
baseResult.setMsg(msg);
return baseResult;
}
}
4.2.2 创建 Order 类
public class Order implements Serializable {
private String orderSn;
private String orderName;
private String orderDetail;
private Date orderTime;
private String userId;
}
4.2.3 创建 TestParamController 类
@RestController
public class TestParamController {
/**
* 测试单个参数
*
* @param name
* @return
*/
@GetMapping("testOneParam")
public BaseResult oneParam(@RequestParam("name") String name) {
System.out.println(name);
return BaseResult.success(200, "成功", "ok");
}
/**
* 测试两个参数
*
* @param name
* @param age
* @return
*/
@PostMapping("testTwoParam")
public BaseResult twoParam(@RequestParam("name") String name,@RequestParam("age") Integer age) {
System.out.println(name + ":" + age);
return BaseResult.success(200, "ok", "ok");
}
/**
* 测试一个对象的传参
*
* @param order
* @return
*/
@PostMapping("testObjectParam")
public BaseResult objectParam(@RequestBody Order order) {
System.out.println(order);
return BaseResult.success(200, "ok", order);
}
/**
* 测试一个对象 一个参数
*
* @param order
* @param name
* @return
*/
@PostMapping("testOneObjectOneParam")
public BaseResult oneObjectOneParam(@RequestBody Order order,
@RequestParam String name) {
System.out.println(order);
System.out.println(name);
return BaseResult.success(200, "ok", order);
}
/**
* 测试 url 传参
** @param id
* @return
*/
@GetMapping("testUrlParam/{id}")
public BaseResult testUrlParam(@PathVariable("id") Integer id) {
System.out.println(id);
return BaseResult.success(200, "ok", id);
}
}
4.3 修改 consumer-user-service
4.3.1 将 Order 类和 BaseResult 类拷贝过来,后面会抽到公共模块里
4.3.2 修改 UserOrderFeign 接口
* @FeignClient 声明是 feign 的调用
* value = "provider-order-service" value 后面的值必须和提供者的服务名一致
*/
@FeignClient(value = "provider-order-service")
public interface UserOrderFeign {
/**
* 远程调用下单的方法
* * @return
*/
@RequestMapping("doOrder")
String doOrder();
/**
* 测试单个参数
*
* @param name
* @return
*/
@GetMapping("testOneParam")
public BaseResult oneParam(@RequestParam("name") String name);
/**
* 测试两个参数
*
* @param name
* @param age
* @return
*/
@PostMapping("testTwoParam")
public BaseResult twoParam(@RequestParam("name") String name,
@RequestParam("age") Integer age);
/**
* 测试一个对象的传参
*
* @param order
* @return
*/
@PostMapping("testObjectParam")
public BaseResult objectParam(@RequestBody Order order);
/**
* 测试一个对象 一个参数
*
* @param order
* @param name
* @return
*/
@PostMapping("testOneObjectOneParam")
public BaseResult oneObjectOneParam(@RequestBody Order order,
@RequestParam String name);
/**
* 测试 url 传参
*
* @param id
* @return
*/
@GetMapping("testUrlParam/{id}")
public BaseResult testUrlParam(@PathVariable("id") Integer id);
}
4.3.3 创建 TestController 类
@RestController
public class TestController {
@Autowired
private UserOrderFeign userOrderFeign;
@RequestMapping("testFeignParam")
public String testFeignParam() {
//测试一个参数
BaseResult result1 = userOrderFeign.oneParam("bjpowernode");
System.out.println(result1);
System.out.println("--------------------------------------------------");
//测试多个参数
BaseResult result2 = userOrderFeign.twoParam("bjpowernode", 666);
System.out.println(result2);
System.out.println("--------------------------------------------------");
//测试一个对象
Order order = new Order("111", "牛排", "一份牛排 256g", new Date(), "159357");
BaseResult result3 = userOrderFeign.objectParam(order);
System.out.println(result3);
System.out.println("--------------------------------------------------");
//测试 url 传参
BaseResult result4 = userOrderFeign.testUrlParam(999);
System.out.println(result4);
System.out.println("--------------------------------------------------");
//测试一个对象 一个参数
BaseResult result5 = userOrderFeign.oneObjectOneParam(order,
"bjpowernodebjpowernode");
System.out.println(result5);
System.out.println("--------------------------------------------------");
return "ok";
}
}
4.3.4 测试调用
访问: http://localhost:8081/testFeignParam
4.3.5 时间日期参数问题
使用 feign 远程调用时,传递 Date 类型,接收方的时间会相差 14 个小时,是因为时区造成
的处理方案:
-
使用字符串传递参数,接收方转换成时间类型(推荐使用)不要单独传递时间
-
使用 JDK8 的 LocalDate(日期) 或 LocalDateTime(日期和时间,接收方只有秒,没有毫
秒) -
自定义转换方法
传参总结:
get 请求只用来传递基本参数 而且加注解@RequestParam (URL restful风格的传递参数用@PathVariable)
post 请求用来传递对象参数 并且加注解@RequestBody