文章目录

  • 四种解决方案:
  • 1.将get请求改为post请求
  • 2.发送请求使用 httpclient,而不是java原生
  • 2.1添加pom依赖
  • 2.2 yml设置允许使用httpclient
  • 2.3 方法上添加注解
  • 2.3.1 接口方法请求参数添加@RequestBody
  • 2.3.2 接口方法上@GetMapping 添加 consumes属性
  • 2.3.3 服务提供方方法上请求参数也需要加@RequestBody注解,方法上@GetMapping 添加 consumes属性
  • 3.springcloud2.1.0前:使用@requestParam注解 + Map传递请求参数
  • 3.1接口上使用@requestParam注解 + Map传递请求参数
  • 3.2服务提供方方法上使用@requestParam注解 + Map传递请求参数
  • 4.springcloud2.1.0后:接口上使用@SpringQueryMap注解


四种解决方案:

1.将get请求改为post请求

优点:快速完成代码修改,进行迭代。

缺点:背离问题本质,没有真正的解决问题。

2.发送请求使用 httpclient,而不是java原生

2.1添加pom依赖

<!-- 配置feign 发送请求使用 httpclient,而不是java原生 -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>
        <!-- 使用Apache HttpClient替换Feign原生httpclient -->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
            <version>10.1.0</version>
        </dependency>

2.2 yml设置允许使用httpclient

feign:
  httpclient:
    enabled: true

2.3 方法上添加注解

2.3.1 接口方法请求参数添加@RequestBody
2.3.2 接口方法上@GetMapping 添加 consumes属性

例:

@ApiOperation(value = "司机信息查看", notes = "")
    @GetMapping(value = "/getDriver",consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public DriverInfoDto getDriver(@RequestBody DriverIdReq driverIdReq);
2.3.3 服务提供方方法上请求参数也需要加@RequestBody注解,方法上@GetMapping 添加 consumes属性

TIP: 服务提供方方法必须与接口方法完全一致,包括@RequestBody注解,@GetMapping 中的 consumes属性,否则会出现拿不到封装的实体对象中的属性值

@ApiOperation(value = "司机档案查看", notes = "")
    @GetMapping(value = "/getDriver",consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public DriverInfoDto getDriver(@RequestBody DriverIdReq driverIdReq) {
        return infoService.getOneByDriverId(driverIdReq.getDriverId() + "");
    }

优点:代码逻辑变更少,对springcloud版本没有要求

缺点:配置文件修改多,代码修改的细节多,缺一不可。

3.springcloud2.1.0前:使用@requestParam注解 + Map传递请求参数

3.1接口上使用@requestParam注解 + Map传递请求参数

@ApiOperation(value = "获取所有驾照类型", notes = "")
    @GetMapping(value = "/licenceType")
    public List<String> licenceType(@RequestParam Map map);

3.2服务提供方方法上使用@requestParam注解 + Map传递请求参数

@ApiOperation(value = "获取所有驾照类型", notes = "")
    @GetMapping("/licenceType")
    public List<String> licenceType(@RequestParam Map adminBaseReq) {
        System.out.println(adminBaseReq);
        return infoService.allDriveLicenceType();
    }

TIP:服务提供方方法必须与接口方法完全一致,包括@requestParam注解,否则会出现拿不到封装的实体对象中的属性值.

优点:代码修改少,不需要修改配置文件,低版本springcloud也可以兼容使用

缺点:参数传递时,map中每个属性的值需要单独写文档标识,不同服务间调用对于参数信息不够明确。

4.springcloud2.1.0后:接口上使用@SpringQueryMap注解

@ApiOperation(value = "司机档案查看", notes = "")
    @GetMapping(value = "/getDriver")
    public DriverInfoDto getDriver(@SpringQueryMap DriverIdReq driverIdReq);

优点:代码修改少,配置修改少,只需要接口参数上添加@SpringQueryMap注解即可

缺点:不支持2.1.0以前的springcloud版本。