OpenFeign 调用参数处理(开发重点)

4.1 说在前面

Feign 传参确保消费者和提供者的参数列表一致 包括返回值 方法签名要一致

  1. 通过 URL 传参数,GET 请求,参数列表使用@PathVariable(“”)

  2. 如果是 GET 请求,每个基本参数必须加@RequestParam(“”)

  3. 如果是 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 个小时,是因为时区造成
的处理方案:

  1. 使用字符串传递参数,接收方转换成时间类型(推荐使用)不要单独传递时间

  2. 使用 JDK8 的 LocalDate(日期) 或 LocalDateTime(日期和时间,接收方只有秒,没有毫
    秒)

  3. 自定义转换方法

传参总结:

get 请求只用来传递基本参数 而且加注解@RequestParam (URL restful风格的传递参数用@PathVariable)
post 请求用来传递对象参数 并且加注解@RequestBody