java 与Set参数进行RestTemplate GET交换< Long>

amrnrhlw  于 2022-12-17  发布在  Java
关注(0)|答案(1)|浏览(134)

我有两个服务(A和B)。我想从服务A向服务B发送一个GET请求。下面是我的请求(服务A):

public Set<StudentDTO> getStudentsByIds(Set<Long> ids) {  //here may be a set of ids [123213L, 435564L]
    return restTemplate.exchange("localhost:8090/students/all?ids={ids}",
        HttpMethod.GET, new HttpEntity<>(ids), new ParameterizedTypeReference<Set<StudentDTO>>() {}, ids).getBody();
}

下面是我的服务B控制器的外观:

@RequestMapping("/students")
public class StudentController {
    @GetMapping("/all")
    public Set<StudentDTO> getStudentsByIds(@RequestParam Set<Long> ids) {
        return studentService.getStudentsByIds(ids);
    }

}

我在发送set作为参数时遇到了麻烦。我想我们不能把Set作为参数。我已经试过把set变成字符串,并像下面这样去掉大括号,它起作用了:

String ids = ids.toString().substring(1, ids.toString().length() - 1);

但也许有更好的解决方案或有任何解决方案发送集?
我的URL如下所示:localhost:8090/students/all?ids=id1&ids=id2&ids=id3

aor9mmx1

aor9mmx11#

您的URL格式不正确。使用all?ids={ids}时,发送到服务层的结果URL为http://localhost:8090/students/all?ids=%5B23677,%2012345,%201645543%5D。这是因为集合中的方括号被添加到URL,但未正确解释。您可以通过将其作为逗号分隔的字符串附加到URL来发送来解决此问题,如下所示。

public Set<Long> getStudentsByIds(Set<Long> ids){
    String studentIdsUrl = "http://localhost:8080/api/all?ids=" + ids.stream().map(Object::toString).collect(Collectors.joining(","));
    return restTemplate.exchange(studentIdsUrl,
        HttpMethod.GET, new HttpEntity<>(ids), new ParameterizedTypeReference<Set<Long>>() {}, ids).getBody();
}

相关问题