You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>类型的参数。

正确的做法

  1. 添加第三方接口调用逻辑
    在服务层中,给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();
    }
    
  2. 修正控制器参数传递
    控制器调用服务层方法时,必须把接收到的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 07:37:29