我最近改用Spring来使用ServiceNow托管的REST API调用。
我正在构建我的URI,如下所示:
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());
Run Code Online (Sandbox Code Playgroud)
此代码的输出是:
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
Run Code Online (Sandbox Code Playgroud)
问题出在最终的builder.queryParam上。我得到这样的输出:
sysparm_query%3Duser_name=AX0011
Run Code Online (Sandbox Code Playgroud)
但我想要的是:
sysparm_query=user_name=AX0011
Run Code Online (Sandbox Code Playgroud)
这样最终的最终URI如下所示:
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
Run Code Online (Sandbox Code Playgroud)
所以我尝试更换
builder.queryParam("sysparm_query=user_name", snUser.getUser_name());
Run Code Online (Sandbox Code Playgroud)
通过:
builder.query("sysparm_query=user_name=" + snUser.getUser_name());
Run Code Online (Sandbox Code Playgroud)
从以下更改了原始输出:
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
Run Code Online (Sandbox Code Playgroud)
至:
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
Run Code Online (Sandbox Code Playgroud)
请注意sysparm_query%3Duser_name = Z001NR6如何更改为sysparm_query = user_name%3DZ001NR6
反正在输出中看到的是=而不是%3D吗?
该参数看起来很奇怪-但是-您可以使用以下UriComponentsBuilder#query方法手动添加:
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
Run Code Online (Sandbox Code Playgroud)
手动串联:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7309 次 |
| 最近记录: |