Spring 的 UriComponentsBuilder.queryParam 问题 [英] Spring's UriComponentsBuilder.queryParam issue

查看:46
本文介绍了Spring 的 UriComponentsBuilder.queryParam 问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最近切换到 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&param2=abc&query=username=JOE

System.out.println(builder.build().encode().toString());
// produces https://example.com/api/?param1=12345&param2=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&param2=abc&query=username=JOE

这篇关于Spring 的 UriComponentsBuilder.queryParam 问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆