Spring 的 UriComponentsBuilder.queryParam 问题 [英] Spring's UriComponentsBuilder.queryParam issue
问题描述
我最近切换到 Spring 以使用 ServiceNow 托管的 REST API 调用.
I have recently switched to Spring for consuming REST API calls hosted by ServiceNow.
我正在构建我的 URI,如下所示:
I am building my URI as below:
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(baseUrl.toString());
logger.info("URI before Query Param: " + builder.build().encode().toUri());
builder.queryParam("sysparm_limit", "2000000");
builder.queryParam("sysparm_offset", "0");
builder.queryParam("sysparm_exclude_reference_link", "true");
//this line is the issue because there is a = sign here
builder.queryParam("sysparm_query=user_name", snUser.getUser_name());
logger.info("URI after Query Param: " + builder.build().encode().toUri());
这段代码的输出是:
INFO: URI before Query Param: https://sandbox.service-now.com/api/now/v1/table/sys_user
INFO: URI after Query Param: https://sandbox.service-now.com/api/now/v1/table/sys_user?sysparm_limit=2000000&sysparm_offset=0&sysparm_exclude_reference_link=true&sysparm_query%3Duser_name=AX0011
问题在于最终的 builder.queryParam.我得到这样的输出:
The problem is with the final builder.queryParam. I am getting output as this:
sysparm_query%3Duser_name=AX0011
但我想要的是:
sysparm_query=user_name=AX0011
所以最终的 URI 看起来像这样:
So that eventually the final URI looks like this:
INFO: URI after Query Param: https://sandbox.service-now.com/api/now/v1/table/sys_user?sysparm_limit=2000000&sysparm_offset=0&sysparm_exclude_reference_link=true&sysparm_query=user_name=Z001NR6
<小时>
所以我尝试更换,
So I tried replacing,
builder.queryParam("sysparm_query=user_name", snUser.getUser_name());
作者:
builder.query("sysparm_query=user_name=" + snUser.getUser_name());
改变了原始输出:
INFO: URI after Query Param: https://sandbox.service-now.com/api/now/v1/table/sys_user?sysparm_limit=2000000&sysparm_offset=0&sysparm_exclude_reference_link=true&sysparm_query%3Duser_name=Z001NR6
到:
INFO: URI after Query Param: https://sandbox.service-now.com/api/now/v1/table/sys_user?sysparm_limit=2000000&sysparm_offset=0&sysparm_exclude_reference_link=true&sysparm_query=user_name%3DZ001NR6
注意 sysparm_query%3Duser_name=Z001NR6 如何更改为 sysparm_query=user_name%3DZ001NR6
Notice how sysparm_query%3Duser_name=Z001NR6 changed to sysparm_query=user_name%3DZ001NR6
无论如何会在输出中看到 = 而不是 %3D 吗?
Is ther anyway to see a = instead of %3D in the output?
推荐答案
该参数看起来很奇怪 - 但是 - 您可以使用 UriComponentsBuilder#query
方法手动添加它:
The param looks quite strange - however - you can add it manually using the UriComponentsBuilder#query
method:
UriComponentsBuilder builder = UriComponentsBuilder
.fromHttpUrl("https://example.com/api/")
.queryParam("param1", "12345")
.queryParam("param2", "abc")
.query("query=username=JOE");
System.out.println(builder.build().toString());
// produces https://example.com/api/?param1=12345¶m2=abc&query=username=JOE
System.out.println(builder.build().encode().toString());
// produces https://example.com/api/?param1=12345¶m2=abc&query=username%3DJOE
手动连接:
UriComponentsBuilder builder = UriComponentsBuilder
.fromHttpUrl("https://example.com/api/")
.queryParam("param1", "12345")
.queryParam("param2", "abc");
// the parameter has to be properly url-encoded manually (not shown here)
String uri = builder.build().encode().toString() + "&query=username=JOE";
System.out.println(uri);
// produces: https://example.com/api/?param1=12345¶m2=abc&query=username=JOE
这篇关于Spring 的 UriComponentsBuilder.queryParam 问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!