RestTemplate:如何一起发送URL和查询参数

Shi*_*iva 41 java query-parameters url-parameters resttemplate 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 = UriComponentsBuilder.fromUriString(url)
                                        .queryParam("name", "myName");
    String uriBuilder = builder.build().encode().toUriString();
    restTemplate.exchange(uriBuilder , HttpMethod.PUT, requestEntity,
                    class_p, params);
Run Code Online (Sandbox Code Playgroud)

我的网址正在变成 http://test.com/Services/rest/%7Bid%7D/Identifier?name=myName

我该怎么做才能让它发挥作用.我期待http://test.com/Services/rest/{id}/Identifier?name=myNameparams将id添加到url

请建议.提前致谢

Mic*_*ksa 102

我会使用buildAndExpandfrom UriComponentsBuilder来传递所有类型的URI参数.

例如:

String url = "http://test.com/solarSystem/planets/{planet}/moons/{moon}";

// URI (URL) parameters
Map<String, String> urlParams = new HashMap<String, String>();
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"
 */
Run Code Online (Sandbox Code Playgroud)

  • 但是“UriComponentsBuilder”类在 Spring 3 中不可用。Spring 3 有没有替代解决方案? (2认同)

hol*_*s83 9

Michal Foksa回答的一个问题是,它首先添加了查询参数,然后扩展了路径变量。如果查询参数包含括号,例如{foobar},将导致异常。

安全的方法是先扩展路径变量,然后添加查询参数:

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);
Run Code Online (Sandbox Code Playgroud)


小智 6

使用带有参数映射的 TestRestTemplate.exchange 函数的单线。

restTemplate.exchange("/someUrl?id={id}", HttpMethod.GET, reqEntity, respType, ["id": id])
Run Code Online (Sandbox Code Playgroud)

像这样初始化的 params 映射是一个groovy初始值设定项*

  • 您是否尝试过使用路径变量。这里您的示例使用查询参数进行演示,并提出了有关路径参数的问题。 (3认同)