将 XML 传递给 URL

Passing XML into a URL

我正在尝试将一些 XML 传递到我正在调用的服务的 URL 中,但是当我 运行 这个时,它给了我一个 IllegalArgumentException

response = Unirest.post(appSettings.getURL() + "&service=test&xml=<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><test><cid>blah</cid><pw>blah</pw></test>")

这是错误:

java.lang.IllegalArgumentException: Illegal character in query at index 108: http://test&service=test&xml=%3C?xml version="1.0" encoding="UTF-8" standalone="no"?><test><cid>blah</cid><pw>blah</pw></test>

我认为这与 XML 的读取方式有关,但我无法弄清楚到底是什么。

空格在 URL 中被转义为 %20,其他非字母数字字符可能会有问题。尝试使用 UrlEncoder http://docs.oracle.com/javase/8/docs/api/java/net/URLEncoder.html 编码 URL 参数:

Unirest.post(appSettings.getURL() + "&service=test&xml=" + URLEncoder.encode("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><test><cid>blah</cid><pw>blah</pw></test>", "UTF-8"))

你也可以试试URIBuilderhttps://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/utils/URIBuilder.html or other methods Java URL encoding of query string parameters

XML 有斜线字符和问号,它们是 URL 参数语法的自然组成部分,但据推测这不是问题。既然我们谈论的是 REST,你不能将 XML 信息作为请求(或响应)的 JSON 有效负载的一部分传递吗?

对于通用(甚至是二进制)URL 参数,我可以想象的一个技巧是使用 Base64 编码您要传递的有效负载(在本例中为 XML),将其放入 URL,另一端可以进行Base64解码。

还请记住,出于安全原因(阻止可能的网络相关攻击,这些攻击通常使用巨大的 URLs 进行操作)浏览器、HTTP 服务器和框架强制执行最大长度为 URL。它在 1-2 KB 左右,因此 XML 数据没有太多 space。