2017-03-31 146 views
1

我米試圖如下發送HTTP請求,使用柑橘類測試框架http://www.citrusframework.org/發送HTTP請求具有編碼URI

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編碼值,但是當它通過柑橘發送請求時再次進行編碼。 as tel%253A%252B94xxxxxxx

有沒有辦法正確發送編碼的URI?

+0

您是否嘗試將未編碼的URI傳遞給Citrus?我想當Citrus和底層的Http客戶端自動進行編碼時,在測試代碼中添加非編碼的URI應該沒問題。 –

+0

HI Christoph,謝謝你的回覆。是的,我嘗試過。當發送非編碼的URI時,它就像它的。例如tel:+ 94xxxxxxx(無編碼)。但需要爲服務器發送編碼的URI。 –

+0

Citrus在春天使用Rest模板,假設需要url編碼,看起來像是「:」和「+」,它們忽略了編碼的鏈接字符[link](https://docs.spring.io/spring/docs/current /javadoc-api/org/springframework/web/client/RestTemplate.html#exchange-java.lang.String-org.springframework.http.HttpMethod-org.springframework.http.HttpEntity-java.lang.Class-java.lang 。目的...-) –

回答

0

柑橘使用於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對象而不是String值的RestTemplate上使用其他方法簽名。作爲一個臨時的變通方法,您可以使用自定義RestTemplate子類覆蓋這樣的方法,並自動創建一個從字符串的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轉換配置和引用豆在Citrus客戶端組件上,使用屬性rest-template