REST中POST请求客户端响应写入机制及空Response返回合理性咨询
关于REST服务中Response返回的疑问
我正在学习REST,目前遇到一个疑问:
在服务层编写了如下方法:
@Override public List<Response> createRequest(List<Request> requests) { List<Object[]> listOfUUIDsAndPermissions = signingInitiationRepository.findStorageUUIDAndPermission(); //从数据库获取参数,用于设置请求并发送给第三方 return IntStream.range(0, Math.min(listOfUUIDsAndPermissions.size(), requests.size())) .mapToObj(i -> { Object[] arr = listOfUUIDsAndPermissions.get(i); Request request = requests.get(i); request.setStorageUUID(UUID.fromString((String) arr[0])); request.setPermissions(new String[]{(String) arr[1]}); request.setServiceTo(ift); return new Response(); }) .toList(); }
我想编写如下简单控制器:
@PostMapping("/testlink") public ResponseEntity<List<Response>> createRequest(@RequestBody List<Request> requests) { var result = myservice.createRequest(); return ResponseEntity.ok(result); }
我的疑问是:我们无需设置Response的部分字段,假设必要信息将由第三方返回,那直接返回return new Response();是否可行?这样真的能如预期工作——发送含必要字段的Request后,收到第三方返回的填充完整的Response吗?
直接返回new Response()不可行,也无法拿到第三方的返回结果
你的代码存在两个核心问题:
没有实际调用第三方接口
目前服务层代码只是给Request对象设置了参数,但完全没有发起对第三方服务的请求。没有调用就不会有第三方返回的Response,现在返回的只是一个空的Response实例,所有字段都是默认值(比如null、0等),根本不会包含第三方的返回数据。控制器逻辑错误
控制器调用myservice.createRequest()时没有传入参数requests,这会导致编译错误,因为服务层的createRequest方法需要接收List<Request>类型的参数。
正确的做法
添加第三方接口调用逻辑
在服务层中,给Request设置完参数后,需要通过HTTP客户端(比如RestTemplate、WebClient)发送请求到第三方服务,获取对方返回的Response对象再收集返回。示例代码如下:@Override public List<Response> createRequest(List<Request> requests) { List<Object[]> listOfUUIDsAndPermissions = signingInitiationRepository.findStorageUUIDAndPermission(); // 以WebClient为例创建HTTP客户端 WebClient webClient = WebClient.create("第三方服务基础URL"); return IntStream.range(0, Math.min(listOfUUIDsAndPermissions.size(), requests.size())) .mapToObj(i -> { Object[] arr = listOfUUIDsAndPermissions.get(i); Request request = requests.get(i); request.setStorageUUID(UUID.fromString((String) arr[0])); request.setPermissions(new String[]{(String) arr[1]}); request.setServiceTo(ift); // 调用第三方接口并获取返回的Response return webClient.post() .uri("/第三方接口具体路径") .bodyValue(request) .retrieve() .bodyToMono(Response.class) .block(); // 同步调用,可根据业务场景选择异步方式 }) .toList(); }修正控制器参数传递
控制器调用服务层方法时,必须把接收到的requests参数传进去:@PostMapping("/testlink") public ResponseEntity<List<Response>> createRequest(@RequestBody List<Request> requests) { var result = myservice.createRequest(requests); return ResponseEntity.ok(result); }
只有这样,服务才会真正把处理后的Request发送给第三方,拿到对方返回的填充完整的Response,再返回给前端。
内容的提问来源于stack exchange,提问作者RobertNickel
相关产品推荐
相关产品推荐

