2016-03-21 226 views
0

我最近轉而使用Spring來使用由ServiceNow託管的REST API調用。Spring的UriComponentsBuilder.queryParam問題

我建設我的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()); 

這段代碼的輸出是:

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。我得到的輸出,因爲這:

sysparm_query%3Duser_name=AX0011 

,但我要的是:

sysparm_query=user_name=AX0011 

,最終使最終的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 

所以,我想替換,

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

是否anyw ay在輸出中看到a =而不是%3d?

回答

1

帕拉姆看起來很奇怪 - 但是 - 你可以將其添加使用手動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&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 
+0

我知道查詢看起來很奇怪,但是這是怎麼回事。在.query(「query = username = JOE」)JOE的值被參數化,我可以通過snUser.getUser_name()來替換。我知道我可以創建一個字符串連接來實現這一點,但UriComponentBuilder中是否有默認方法? –

+0

不,沒有可用的默認方法。但是繼續使用字符串連接(java編譯器會優化這個反正到'StringBuilder') – fateddy

+0

我加入了你所建議的改變,它並沒有產生所需的效果。有什麼我在這裏失蹤?我修改了原文,以反映它。 –