Java RestTemplate:如何同时发送URL和查询参数
我试图在URL中传递路径参数和查询参数,但遇到了一个奇怪的错误。下面是代码Java RestTemplate:如何同时发送URL和查询参数,java,resttemplate,url-parameters,query-parameters,path-parameter,Java,Resttemplate,Url Parameters,Query Parameters,Path Parameter,我试图在URL中传递路径参数和查询参数,但遇到了一个奇怪的错误。下面是代码 String url = "http://test.com/Services/rest/{id}/Identifier" Map<String, String> params = new HashMap<String, String>(); params.put("id", "1234"); UriComponentsBuilder builder = UriCom
String url = "http://test.com/Services/rest/{id}/Identifier"
Map<String, String> params = new HashMap<String, String>();
params.put("id", "1234");
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(url)
.queryParam("name", "myName");
String uriBuilder = builder.build().encode().toUriString();
restTemplate.exchange(uriBuilder , HttpMethod.PUT, requestEntity,
class_p, params);
stringurl=”http://test.com/Services/rest/{id}/标识符“
Map params=新的HashMap();
参数put(“id”、“1234”);
UriComponentsBuilder=UriComponentsBuilder.fromUrString(url)
.queryParam(“姓名”、“我的姓名”);
字符串uriBuilder=builder.build().encode().toUriString();
restTemplate.exchange(uriBuilder、HttpMethod.PUT、requestEntity、,
类(p,参数);
我的url变得越来越http://test.com/Services/rest/%7Bid%7D/Identifier?name=myName
我该怎么做才能让它工作。我期待http://test.com/Services/rest/{id}/Identifier?name=myName
以便params将id添加到url
请建议。提前感谢我将使用
UriComponentsBuilder
中的buildAndExpand
传递所有类型的URI参数
例如:
String url = "http://test.com/solarSystem/planets/{planet}/moons/{moon}";
// URI (URL) parameters
Map<String, String> urlParams = new HashMap<>();
urlParams.put("planets", "Mars");
urlParams.put("moons", "Phobos");
// Query parameters
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(url)
// Add query parameter
.queryParam("firstName", "Mark")
.queryParam("lastName", "Watney");
System.out.println(builder.buildAndExpand(urlParams).toUri());
/**
* Console output:
* http://test.com/solarSystem/planets/Mars/moons/Phobos?firstName=Mark&lastName=Watney
*/
restTemplate.exchange(builder.buildAndExpand(urlParams).toUri() , HttpMethod.PUT,
requestEntity, class_p);
/**
* Log entry:
* org.springframework.web.client.RestTemplate Created PUT request for "http://test.com/solarSystem/planets/Mars/moons/Phobos?firstName=Mark&lastName=Watney"
*/
stringurl=”http://test.com/solarSystem/planets/{行星}/卫星/{卫星}”;
//URI(URL)参数
Map urlParams=newhashmap();
urlParams.put(“行星”、“火星”);
urlParams.put(“月亮”、“火卫一”);
//查询参数
UriComponentsBuilder=UriComponentsBuilder.fromUrString(url)
//添加查询参数
.queryParam(“名字”、“标记”)
.queryParam(“姓氏”、“沃特尼”);
System.out.println(builder.buildAndExpand(urlparms.toUri());
/**
*控制台输出:
* http://test.com/solarSystem/planets/Mars/moons/Phobos?firstName=Mark&lastName=Watney
*/
restemplate.exchange(builder.buildAndExpand(urlParams.toUri(),HttpMethod.PUT,
请求实体,类别p);
/**
*日志条目:
*org.springframework.web.client.RestTemplate已为“”创建放置请求http://test.com/solarSystem/planets/Mars/moons/Phobos?firstName=Mark&lastName=Watney"
*/
Michal Foksa的答案的一个问题是,它首先添加查询参数,然后扩展路径变量。如果查询参数包含括号,例如{foobar}
,这将导致异常
安全的方法是首先展开路径变量,然后添加查询参数:
stringurl=”http://test.com/Services/rest/{id}/标识符”;
Map params=新的HashMap();
参数put(“id”、“1234”);
URI=UriComponentsBuilder.FromUrString(url)
.buildAndExpand(参数)
.toUri();
uri=UriComponentsBuilder
.fromUri(uri)
.queryParam(“姓名”、“我的姓名”)
.build()
.toUri();
交换(uri,HttpMethod.PUT,requestEntity,class\p);
一个使用TestRestTemplate.exchange函数和参数映射的线性程序
restTemplate.exchange("/someUrl?id={id}", HttpMethod.GET, reqEntity, respType, ["id": id])
像这样初始化的参数映射是groovy初始值设定项*一种简单的方法是:
String url = "http://test.com/Services/rest/{id}/Identifier"
UriComponents uriComponents = UriComponentsBuilder.fromUriString(url).build();
uriComponents = uriComponents.expand(Collections.singletonMap("id", "1234"));
然后添加查询参数。字符串url=”http://test.com/Services/rest/{id}/标识符”;
String url = "http://test.com/Services/rest/{id}/Identifier";
Map<String, String> params = new HashMap<String, String>();
params.put("id", "1234");
URI uri = UriComponentsBuilder.fromUriString(url)
.buildAndExpand(params)
.toUri();
uri = UriComponentsBuilder
.fromUri(uri)
.queryParam("name", "myName")
.build()
.toUri();
restTemplate.exchange(uri , HttpMethod.PUT, requestEntity, class_p);
Map params=新的HashMap();
参数put(“id”、“1234”);
URI=UriComponentsBuilder.FromUrString(url)
.buildAndExpand(参数)
.toUri();
uri=UriComponentsBuilder
.fromUri(uri)
.queryParam(“姓名”、“我的姓名”)
.build()
.toUri();
交换(uri,HttpMethod.PUT,requestEntity,class\p);
安全的方法是首先展开路径变量,然后添加查询参数:
对我来说,这导致了重复编码,例如,一个空格被解码为%2520(空格->%20->%25)
我通过以下方式解决了这个问题:
String url = "http://test.com/Services/rest/{id}/Identifier";
Map<String, String> params = new HashMap<String, String>();
params.put("id", "1234");
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromUriString(url);
uriComponentsBuilder.uriVariables(params);
Uri uri = uriComponentsBuilder.queryParam("name", "myName");
.build()
.toUri();
restTemplate.exchange(uri , HttpMethod.PUT, requestEntity, class_p);
stringurl=”http://test.com/Services/rest/{id}/标识符”;
Map params=新的HashMap();
参数put(“id”、“1234”);
UriComponentsBuilder UriComponentsBuilder=UriComponentsBuilder.fromUristering(url);
uriComponentsBuilder.uriVariables(参数);
Uri=uriComponentsBuilder.queryParam(“名称”、“myName”);
.build()
.toUri();
交换(uri,HttpMethod.PUT,requestEntity,class\p);
本质上,我使用的是uriComponentsBuilder.uriVariables(params)代码>以添加路径参数。文件说:
。。。与UriComponents.expand(Map)或buildAndExpand(Map)不同,当您需要提供URI变量而不构建UriComponents实例时,或者可能需要预扩展某些共享默认值(如主机和端口…)时,此方法非常有用
来源:但是“UriComponentsBuilder”类在Spring3中不可用。Spring 3是否有其他解决方案?您是否尝试过使用path变量。这里的示例演示了如何使用查询参数,并提出了有关path参数的问题。