• 13.OpenFeign 多个传递参数的方式:开发重点(springcloud)


    1 简介
    Feign 传参确保消费者和提供者的参数列表一致 包括返回值 方法签名要一致
    1. 通过 URL 传参数, GET 请求,参数列表使用 @PathVariable (“”)
    2. 如果是 GET 请求,每个基本参数必须加 @RequestParam (“”)
    3. 如果是 POST 请求,而且是对象集合等参数,必须加 @Requestbody 或者 @RequestParam
    2 修改 oreder-service-01

     

    2.2 创建 Order
    1. package com.it.entity;
    2. import lombok.AllArgsConstructor;
    3. import lombok.Builder;
    4. import lombok.Data;
    5. import lombok.NoArgsConstructor;
    6. import java.util.Date;
    7. @Data
    8. @AllArgsConstructor
    9. @NoArgsConstructor
    10. @Builder
    11. public class Order {
    12. private Integer id;
    13. private String name;
    14. private Double price;
    15. private Date time;
    16. }

    2.3 创建 TestParamController
    1. package com.it.controller;
    2. import com.it.entity.Order;
    3. import org.springframework.web.bind.annotation.*;
    4. /**
    5. * url /doOrder/汉堡/add/油条/aaa
    6. * get传递一个参数
    7. * get传递多个参数
    8. * post传递一个对象
    9. * post传递一个对象+一个基本参数
    10. */
    11. @RestController
    12. public class ParamController {
    13. @GetMapping("testUrl/{name}/and/{age}")
    14. public String testUrl(@PathVariable("name")String name,@PathVariable("age")Integer age){
    15. System.out.println(name+":"+age);
    16. return "ok";
    17. }
    18. /**
    19. *@RequestParam(required = false)
    20. * 加上括号中的内容,传递参数时,可以不写参数;如果不加,就必须要有参数
    21. */
    22. @GetMapping("oneParam")
    23. public String oneParam(@RequestParam(required = false) String name){
    24. System.out.println(name);
    25. return "ok";
    26. }
    27. @GetMapping("twoParam")
    28. public String twoParam(@RequestParam(required = false) String name,@RequestParam(required = false) Integer age){
    29. System.out.println(name);
    30. System.out.println(age);
    31. return "ok";
    32. }
    33. @PostMapping("oneObj")
    34. public String oneObj(@RequestBody Order order){
    35. System.out.println(order);
    36. return "ok";
    37. }
    38. @PostMapping("oneObjOneParam")
    39. public String oneObjOneParam(@RequestBody Order order,@RequestParam("name") String name){
    40. System.out.println(order);
    41. System.out.println(name);
    42. return "ok";
    43. }
    44. }

    3 修改user-service-02

     

    3.1 Order 拷贝过来,后面会抽到公共模块里
    3.2 修改 UserOrderFeign 接口
    1. package com.it.feign;
    2. import com.it.entity.Order;
    3. import org.springframework.cloud.openfeign.FeignClient;
    4. import org.springframework.web.bind.annotation.*;
    5. /**
    6. * @FeignClient(value = "order-service")
    7. * value:就是提供者的应用名称
    8. */
    9. @FeignClient(value = "order-service")
    10. public interface UserOrderFeign {
    11. @GetMapping("doOrder")
    12. public String doOrder();
    13. @GetMapping("testUrl/{name}/and/{age}")
    14. public String testUrl(@PathVariable("name")String name, @PathVariable("age")Integer age);
    15. /**
    16. *@RequestParam(required = false)
    17. * 加上括号中的内容,传递参数时,可以不写参数;如果不加,就必须要有参数
    18. */
    19. @GetMapping("oneParam")
    20. public String oneParam(@RequestParam(required = false) String name);
    21. @GetMapping("twoParam")
    22. public String twoParam(@RequestParam(required = false) String name,@RequestParam(required = false) Integer age);
    23. @PostMapping("oneObj")
    24. public String oneObj(@RequestBody Order order);
    25. @PostMapping("oneObjOneParam")
    26. public String oneObjOneParam(@RequestBody Order order,@RequestParam("name") String name);
    27. }

    3.3 创建 TestController
    1. package com.it.controller;
    2. import com.it.entity.Order;
    3. import com.it.feign.UserOrderFeign;
    4. import com.netflix.discovery.converters.Auto;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.web.bind.annotation.GetMapping;
    7. import org.springframework.web.bind.annotation.RestController;
    8. import java.util.Date;
    9. @RestController
    10. public class UserControler {
    11. @Autowired
    12. public UserOrderFeign userOrderFeign;
    13. /**
    14. * feign的默认等待时间是1S
    15. *超过1S就会报错
    16. */
    17. @GetMapping("userDoOrder")
    18. public String userDoOrder(){
    19. System.out.println("有用户进来了");
    20. //发起一个远程调用
    21. String s = userOrderFeign.doOrder();
    22. return s;
    23. }
    24. @GetMapping("testParam")
    25. public String testParam(){
    26. String xiaoming = userOrderFeign.testUrl("xiaoming", 18);
    27. System.out.println(xiaoming);
    28. String s = userOrderFeign.oneParam("小红");
    29. System.out.println(s);
    30. String twoParam = userOrderFeign.twoParam("小兰", 22);
    31. System.out.println(twoParam);
    32. Order order = Order.builder()
    33. .id(01)
    34. .name("汉堡")
    35. .price(15D)
    36. .time(new Date())
    37. .build();
    38. String oneObj = userOrderFeign.oneObj(order);
    39. System.out.println(oneObj);
    40. String oneObjOneParam = userOrderFeign.oneObjOneParam(order, "小绿");
    41. System.out.println(oneObjOneParam);
    42. return "ok";
    43. }
    44. }

    3.4 测试调用
    url传参

      

    get传递一个参数

     

     

    get传递两个参数

     

     

    post传递一个对象

     

     

    post传递一个对象和一个参数

     

     

     

    3.5 时间日期参数问题
    使用 feign 远程调用时,传递 Date 类型,接收方的时间会相差 14 个小时,是因为时区造成的
    处理方案:
    1. 使用字符串传递参数,接收方转换成时间类型(推荐使用)不要单独传递时间
    2. 使用 JDK8 LocalDate( 日期 ) LocalDateTime( 日期和时间,接收方只有秒,没有毫秒)
    3. 自定义转换方法
    传参总结:
    get 请求只用来传递基本参数 而且加注解 @RequestParam
    post 请求用来传递对象参数 并且加注解 @RequestBody
  • 相关阅读:
    DispatcherServlet 分发流程
    C语言实现将矩阵上下翻转(正反解算结果融合时用到)
    一个自己用的复制对象的工具类
    牛客首发半小时点击过热,300MB 实战 SpringBoot 笔记 GitHub 上被爆赞
    用postman发请求显示类型转换错误
    cesium 设置默认视图
    Mycat2+Mysql+Docker搭建简单的主从复制和读写分离
    2流高手速成记(之三):SpringBoot整合mybatis/mybatis-plus实现数据持久化
    Linux扩展篇之Shell编程四(正则表达式入门)
    凯撒密码(Python)
  • 原文地址:https://blog.csdn.net/weixin_59334478/article/details/127810331