Spring TestRestTemplate不编码" +"字符

时间:2017-11-20 06:08:45

标签: spring spring-boot

我正在做一个SAML请求,它有一个名为" SAMLRequest"的base64编码参数。问题是" +"字符没有得到URL编码(它适用于其他字符,如" =")。当在服务器上收到请求时,它被认为是无效的文档,因为所有" +"人物现在是空间" "字符。

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_XML);
    String base64SamlRequest = Base64.encode(... some payload ...);
    HttpEntity<Object> httpEntity = new HttpEntity<>(base64SamlRequest, headers);
    restTemplate.exchange(endpoint+"&SAMLRequest="+base64SamlRequest, method, httpEntity, String.class);

我还尝试使用SAMLRequest={base64SamlRequest}进行模板化,作为网址的一部分。

restTemplate.exchange(endpoint, method, httpEntity, String.class, base64SamlRequest);

启用日志记录logging.level.org.apache.http=DEBUG我可以看到+字符是url参数中的纯文本(未编码)。

如何强制对这些进行编码?或者我可以在上面的代码中对其进行更改以正确编码吗?

2 个答案:

答案 0 :(得分:0)

进行URL的Base64编码字符串操作的最佳Spring实践是使用Spring的Base64Utils

Linkered/Envoy

这可确保在编码过程中所有字符都能正确转义。

请参阅Spring-Boot管理控制台代码中的this example

有关详细信息,请参阅Base64Utils source,其中使用Base64#getUrlEncoder对字符串进行编码。

答案 1 :(得分:0)

我现在已经解决了这个问题。事实证明,我需要模拟SAML请求的表单提交。 URL编码表单数据的规则是不同的。

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

    String base64SamlRequest = Base64Utils.encodeToString(authnRequest.getBytes());

    MultiValueMap<String, String> form = new LinkedMultiValueMap<String, String>();
    form.add("username", "user");
    form.add("password", "password");
    form.add("SAMLRequest", base64SamlRequest);

    HttpEntity<Object> httpEntity = new HttpEntity<>(form, headers);

    ResponseEntity<String> response = restTemplate.postForEntity(endpoint, httpEntity, String.class);