问题:feign接口中的请求类和远程服务接口的请求类是否可以不一样?feign接口中的响应类和远程服务接口的响应类是否可以不一样?
① 首先将knowledge和auth服务都配置进eureka:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
② auth服务的项目路径为:
server: port: 8081 servlet.context-path: /ngso/AUTH/
③ 远程auth服务的接口:
@Api(tags = "用户表")
@Slf4j
@Validated
@RestController
@ResponseResult
@RequestMapping("/api/v2")
public class UserController {
@Autowired
private IUserService userService;
@PostMapping("/users/inner/exact")
public PageData exactPageQueryUserList(@Validated @RequestBody UserQo userQo,
@RequestParam(SessionKey.DOMAIN_ID) String domainId) {
userQo.setDomainId(domainId);
return userService.exactPageQueryUserList(userQo);
}
}
请求类UserReqDto:
@Data
public class UserReqDto {
@ApiModelProperty(value = "用户ID集合")
private List userIds;
@ApiModelProperty(value = "分页页码")
@Min(value = 1, message = "页码需要从1开始")
private int pageNum;
@ApiModelProperty(value = "分页页面条数")
@Min(value = 1, message = "分页条数需要从1开始")
private int pageSize;
public UserReqDto(List userIds){
this.userIds = userIds;
}
}
响应类UserResp:
@Data
public class UserResp {
@ApiModelProperty("主键")
private String id;
@ApiModelProperty("用户名")
private String name;
}
④ knowledge服务的feign接口,调用远程auth服务的接口:
@FeignClient(name = "AUTH")
public interface AuthFeignService {
@PostMapping("/ngso/AUTH/api/v2/users/inner/exact")
PageData exactPageQueryUserList(
@RequestBody UserReqDto userReqDto,
@RequestParam(SessionKey.DOMAIN_ID) String domainId);
}
请求类UserQo:
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@ApiModel(description = "用户表的查询参数")
public class UserQo extends PageData implements Serializable {
private static final long serialVersionUID = 5730367880056040405L;
@ApiModelProperty("用户ID")
private String id;
@ApiModelProperty("当前操作者的ID")
private String operator;
@ApiModelProperty("用户名")
private String name;
@ApiModelProperty("精确查询的名称集合")
private List exactNames;
@ApiModelProperty("角色描述")
private String description;
@ApiModelProperty("用户名或描述")
private String nameOrDescription;
@ApiModelProperty("手机号码")
private String phone;
@ApiModelProperty("电子邮箱")
private String email;
@ApiModelProperty("域ID")
private String domainId;
@ApiModelProperty("租户ID")
private String projectId;
@ApiModelProperty("租户ID集合")
private List projectIds;
@ApiModelProperty(value = "用户类型")
private String type;
@ApiModelProperty(value = "用户ID集合")
private List userIds;
@ApiModelProperty("用户可见性字段")
private Integer visible;
@ApiModelProperty("内置角色不能删除、禁用、修改")
private Integer builtIn;
}
响应类UserEntity :
@Data
@ApiModel(value = "用户实体")
public class UserEntity implements Serializable {
private static final long serialVersionUID = 671647501342140183L;
public static final Integer OPTIONS_NOT_VISIBLE_TO_USER = 8;
@ApiModelProperty("主键")
private String id;
@ApiModelProperty("用户名")
private String name;
@ApiModelProperty("密码")
private String password;
@ApiModelProperty("手机号码")
private String phone;
@ApiModelProperty("电子邮箱")
private String email;
@ApiModelProperty("用户描述")
private String description;
@ApiModelProperty("域ID")
private String domainId;
@ApiModelProperty("租户ID")
private String projectId;
@ApiModelProperty("是否启用")
private Integer enabled;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
@ApiModelProperty("修改密码时间")
private Date changeTime;
@ApiModelProperty("登录时间")
private Date loginTime;
@ApiModelProperty("0:默认未定义;1:第一次登录不要求改密码;2:忽略密码过期检查;4:账号可以重置自己的密码;8:用户不可见")
private Integer options;
@ApiModelProperty("内置账号不能编辑、禁用、删除")
private Integer builtIn;
}
⑤ 在knowledge服务中调用feign接口:
@Override
public String addDoc() {
List userIds = new ArrayList<>();
UserInfo userInfo = UserInfoShareHolder.getUserInfo();
userIds.add(userInfo.getId());
UserReqDto userReqDto = new UserReqDto(userIds);
userReqDto.setPageNum(1);
userReqDto.setPageSize(1);
PageData pageDataApiResponse = authFeignService
.exactPageQueryUserList(userReqDto, UserInfoShareHolder.getUserInfo().getDomainId());
}
结论:是不是觉得很神奇?
① feign接口中的请求类和远程服务接口的请求类可以不一样
② feign接口中的响应类和远程服务接口的响应类可以不一样
数据的传输是以json格式进行传输的,调用@RequestBody注解会将请求的实体类UserReqDto转换为json数据,远程调用exactPageQueryUserList(@Validated @RequestBody UserQo userQo,@RequestParam(SessionKey.DOMAIN_ID) String domainId)时,又会将json数据转换为UserQo 实体类



