文章目录
- 四种解决方案:
- 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版本。