相关疑难解决方法(0)

在调用Spring RestController时,使用Spring的RestTemplate转义URL变量的正确方法是什么?

在调用RestTemplate.exchangeget请求时,例如:

String foo = "fo+o";
String bar = "ba r";
restTemplate.exchange("http://example.com/?foo={foo}&bar={bar}", HttpMethod.GET, null, foo, bar)
Run Code Online (Sandbox Code Playgroud)

为get请求正确转义URL变量的正确方法是什么?

具体来说,我如何+正确地转义pluses()因为Spring将其解释为空格,所以,我需要对它们进行编码.

我尝试使用UriComponentsBuilder这样的:

String foo = "fo+o";
String bar = "ba r";
UriComponentsBuilder ucb = UriComponentsBuilder.fromUriString("http://example.com/?foo={foo}&bar={bar}");
System.out.println(ucb.build().expand(foo, bar).toUri());
System.out.println(ucb.build().expand(foo, bar).toString());
System.out.println(ucb.build().expand(foo, bar).toUriString());
System.out.println(ucb.build().expand(foo, bar).encode().toUri());
System.out.println(ucb.build().expand(foo, bar).encode().toString());
System.out.println(ucb.build().expand(foo, bar).encode().toUriString());
System.out.println(ucb.buildAndExpand(foo, bar).toUri());
System.out.println(ucb.buildAndExpand(foo, bar).toString());
System.out.println(ucb.buildAndExpand(foo, bar).toUriString());
System.out.println(ucb.buildAndExpand(foo, bar).encode().toUri());
System.out.println(ucb.buildAndExpand(foo, bar).encode().toString());
System.out.println(ucb.buildAndExpand(foo, bar).encode().toUriString());
Run Code Online (Sandbox Code Playgroud)

并打印:

http://example.com/?foo=fo+o&bar=ba%20r
http://example.com/?foo=fo+o&bar=ba r
http://example.com/?foo=fo+o&bar=ba r
http://example.com/?foo=fo+o&bar=ba%20r
http://example.com/?foo=fo+o&bar=ba%20r
http://example.com/?foo=fo+o&bar=ba%20r
http://example.com/?foo=fo+o&bar=ba%20r
http://example.com/?foo=fo+o&bar=ba r
http://example.com/?foo=fo+o&bar=ba r
http://example.com/?foo=fo+o&bar=ba%20r
http://example.com/?foo=fo+o&bar=ba%20r
http://example.com/?foo=fo+o&bar=ba%20r …
Run Code Online (Sandbox Code Playgroud)

spring resttemplate

21
推荐指数
4
解决办法
2315
查看次数

为什么应用程序/ json上的Spring解码+(加号)会得到请求?我该怎么办呢?

我有一个Spring应用程序接收类似的请求http://localhost/foo?email=foo+bar@example.com.这会触发一个大致如下所示的控制器:

@RestController
@RequestMapping("/foo")
public class FooController extends Controller {
    @GetMapping
    public void foo(@RequestParam("email") String email) {
       System.out.println(email)
    }
}
Run Code Online (Sandbox Code Playgroud)

当我可以访问时email,它已被转换为foo bar@example.com而不是原始的foo+bar@example.com.根据何时将空间编码为加号(+)或%20?这应该只发生在内容所在的请求中application/x-www-form-urlencoded.我的请求的内容类型为application/json.请求的完整MIME标头如下所示:

=== MimeHeaders ===
accept = application/json
content-type = application/json
user-agent = Dashman Configurator/0.0.0-dev
content-length = 0
host = localhost:8080
connection = keep-alive
Run Code Online (Sandbox Code Playgroud)

为什么Spring会将plus解码为空格?如果这是它应该工作的方式,为什么它不像编写%2B请求时那样编码

我发现了这个关于它的错误报告:https://jira.spring.io/browse/SPR-6291这可能暗示这是在3.0.5版本上修复的,我使用的是Spring> 5.0.0.我可能会误解错误报告的某些内容.

我还发现了关于这些值的RestTemplate处理的讨论:https://jira.spring.io/browse/SPR-5516(我的客户端正在使用RestTemplate).

所以,我的问题是,为什么Spring这样做?我该如何禁用它?我应该禁用它还是应该在客户端编码加号,即使请求是json?

只是为了澄清,我在这里任何地方都不使用HTML或JavaScript.有一个Spring Rest Controller,客户端是Spring的RestTemplate,UriTemplate或者UriComponentsBuilder …

url encoding spring resttemplate

6
推荐指数
1
解决办法
4434
查看次数

标签 统计

resttemplate ×2

spring ×2

encoding ×1

url ×1