簡體   English   中英

帶有特殊字符的 Springboot Rest Template 查詢參數

[英]Springboot Rest Template query param with special characters

我通過這樣的java代碼調用一個api。

UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(myUrl);
builder.queryParam("sandwich","PB_&_J");

return restTemplate.exchange(builder.toUriString(),HttpMethod.GET,MyObject.class);

具有此參數的 api 服務為

@GetMapping("myUrl")
MyObject myApiFunction( @RequestParam String sandwich){
    log(sandwich);
   //return something
}

沒有正確使用此請求(它在日志中有 '%26' 而不是 '&' )。

但是,如果我以http://myurl?sandwich=PB_%26_J的形式打印builder.toUriString()並通過 Postman 訪問它,則 api 服務會正確使用它。

restTemplate代碼有什么問題?

UriComponentsBuilder.toUriString()對其變量進行編碼。 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/util/UriComponentsBuilder.html#toUriString--

如果您希望您的參數不編碼,則構建未編碼的 URI,然后將其傳遞給 RestTemplate。

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/util/UriComponentsBuilder.html#build--

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/util/UriComponents.html#toUri--

例如,

restTemplate.exchange(builder.build().toUri(), HttpMethod.GET,MyObject.class);

您可以傳遞未編碼的 uri。 但網絡瀏覽器請求編碼的 uri。 因此,我建議您在制作控制器后,在現實世界的瀏覽器中進行測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM