1

我试图发送http请求如下,使用柑橘测试框架http://www.citrusframework.org/

http().client(ENV).post("/xx/v1/ouxxtbound/tel%3A%2B94xxxxxxx")
                .header("Authorization", authorization)**strong text**
                .header("Accept", "application/json")
                .payload(send)
                .contentType("application/json");

它正在传递一个 url 编码值,但是当它通过 Citrus.as 发送请求时再次编码时 tel%253A%252B94xxxxxxx

有没有办法正确发送编码的 URI?

4

1 回答 1

0

Citrus 在 Spring RestTemplate 上使用以下方法

public <T> ResponseEntity<T> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables) throws RestClientException {
    ...
}

url 以字符串值的形式给出,Spring 会自动编码这个值。当传入一些已经编码的字符串时,编码会完成两次。当使用非编码字符串值时,Spring RestTemplate 应用 uriVariables 逻辑,这也会导致错误。

Citrus 应该在使用 URL 对象而不是字符串值的 RestTemplate 上使用其他方法签名。作为临时解决方法,您可以使用自定义 RestTemplate 子类来覆盖这样的方法并自动从 String 创建 URL 对象:

@Override
public <T> ResponseEntity<T> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables) throws RestClientException {
    return super.exchange(URI.create(url), method, requestEntity, responseType);
}

您可以将自定义 RestTemplate 子类作为 Spring bean 添加到配置中,并使用属性rest-template在 Citrus 客户端组件上引用该 bean 。

于 2017-05-12T15:49:44.447 回答