Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RestTemplate:如何同时发送URL和查询参数_Java_Resttemplate_Url Parameters_Query Parameters_Path Parameter - Fatal编程技术网

Java RestTemplate:如何同时发送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

我试图在URL中传递路径参数和查询参数,但遇到了一个奇怪的错误。下面是代码

    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参数的问题。