如何使用Spring的rest模板对查询参数的整个xml值进行URL编码?

时间:2018-10-24 16:17:42

标签: java rest spring-boot

我正在使用Spring Boot应用程序

我需要向外部服务提出请求,此服务陈旧且思想不周。该请求采用HTTP GET(或POST)调用的形式,但是有效载荷(即xml内容)需要作为查询参数传递。例如,

GET http://ill-service.com/plain.cgi?XML_DATA=<request attribute="attributeValue"><content contentAttribute="plain"/></request>

当然,查询参数XML_DATA的值需要进行URL编码,通常,遵循RFC 3986(请参阅http://www.ietf.org/rfc/rfc3986.txt),Spring boot的RestTemplate可以很好地工作。

除了此RFC允许的那样,param值中还保留了'/'和'='字符,这给了我以下查询:

GET http://ill-service.com/plain.cgi?XML_DATA=%3Crequest%20attribute=%22attributeValue%22%3E%3Ccontent%20contentAttribute=%22plain%22/%3E%3C/request%3E

这绝对是件好事,但是您还记得我说过我要致电的服务构想错误吗?在另一个世界中,它需要具有完整内容的XML_DATA URL编码。换句话说,它需要以下查询:

GET http://ill-service.com/plain.cgi?XML_DATA=%3Crequest%20attribute%3D%22attributeValue%22%3E%3Ccontent%20contentAttribute%3D%22plain%22%2F%3E%3C%2Frequest%3E%0A

我对如何指导其余模板或正在使用的UriComponentBuilder感到迷茫。任何帮助将不胜感激

3 个答案:

答案 0 :(得分:1)

可能您可以使用spring的UriUtils

答案 1 :(得分:0)

首先使用java.net.URLEncoderXML有效载荷进行编码,然后附加编码后的有效载荷。

答案 2 :(得分:0)

根据Vasif的建议以及有关UriComponentBuilder的一些信息,我找到了以下解决方案:

String xmlContent = "<request attribute="attributeValue"><content contentAttribute="plain"/></request>";

URI uri = UriComponentsBuilder.fromHttpUrl("http://ill-service.com/plain.cgi")
    //This part set the query param as a full encoded value, not as query value encoded
    .queryParam("XML_DATA", UriUtils.encode(xmlContent, "UTF-8"))
    //The build(true) indicate to the builder that the Uri is already encoded
    .build(true).toUri();

String responseStr = restTemplate.getForObject(uri ,String.class)