java 如何通过Spring RestTemplate将&符号作为参数值的一部分传递

8ljdwjyq  于 2023-04-28  发布在  Java
关注(0)|答案(2)|浏览(135)

我正在从一个Web服务向另一个Web服务发出一个GET请求,我需要传递一个值中有&符号的参数。例如GET http://sandwich.com?flavor=[value],其中[value]应为PB& J。但是,使用Spring的RestTemplate执行此操作似乎是不可能的。
当我通过cURL进行此调用时,我只需将与符号替换为%26,i。即flavor=PB%26J
然而,当我将URL传递给Spring的RestTemplate.exchange(String, HttpMethod, HttpEntity<?>, Class<T>)时,它似乎有选择地转义字符。也就是说,如果我传入flavor=PB%26J,它会转义百分号,得到flavor=PB%2526J。但是,如果我传入flavor=PB&J,它会留下与号,从而产生flavor=PB&J,它被视为两个参数。
我已经追踪到RestTemplate调用UriTemplateHandler.expand(String, Object...)的地方,但我不确定从这里可以做什么,因为我开始的输入值都没有导致所需的PB%26J

bvpmtnay

bvpmtnay1#

您可以在UriComponentsBuilder的帮助下生成url字符串。encode()方法应该可以帮助你正确编码url。

String url = UriComponentsBuilder
        .fromUriString("http://sandwich.com")
        .queryParam("flavor", "PB&J")
        .encode() // this should help with encoding the url properly
        .build().toString(); // Gives http://sandwich.com?flavor=PB%26J
RestTemplate.exchange(url, HttpMethod, HttpEntity<?>, Class<T>)

或者更好的方法是,只传递URI对象

URI uri = UriComponentsBuilder
        .fromUriString("http://sandwich.com")
        .queryParam("flavor", "PB&J")
        .encode() // this should help with encoding the url properly
        .build();
RestTemplate.exchange(uri, HttpMethod, HttpEntity<?>, Class<T>)
dgsult0t

dgsult0t2#

在您情况下,这应该有效:

@GetMapping("/")
public List<Entity> list(@PathParam("flavor") String[] values) throws Exception {

相关问题