由 new URI(string)
解析的 URI 字符串示例,在查询字符串中包含编码的保留字符“#”(%23):
http://localhost:34455/ldp-test-43272e5c-1e3f-4bb8-8541-fa5ea6d6567a?predicate=http%3A%2F%2Fwww.w3.org%2Fns%2Foa%23hasBody
然后将 URI 对象简单地传递给 HttpRequest.newBuilder(uri)
这是日志,第一个条目显示服务器处理的请求字符串被截断,但响应和请求 URI 显示完整的字符串:
127.0.0.1 - - [22/Feb/2018:10:30:51 +0000] "GET /ldp-test-43272e5c-
1e3f-4bb8-8541-fa5ea6d6567a?predicate=http://www.w3.org/ns/oa
HTTP/1.1" 200 3 "-" "-" 64
INFO [2018-02-22 10:30:51,137] cool.pandora.ldpclient.LdpClientImpl:
request URI is http://localhost:34455/ldp-test-43272e5c-1e3f-4bb8-
8541-fa5ea6d6567a?
predicate=http%3A%2F%2Fwww.w3.org%2Fns%2Foa%23hasBody
INFO [2018-02-22 10:30:51,141] cool.pandora.ldpclient.LdpClientImpl:
response URI is http://localhost:34455/ldp-test-43272e5c-1e3f-4bb8-
8541-fa5ea6d6567a?
predicate=http%3A%2F%2Fwww.w3.org%2Fns%2Foa%23hasBody
INFO [2018-02-22 10:30:51,141] cool.pandora.ldpclient.LdpClientImpl:
http version is HTTP_1_1
INFO [2018-02-22 10:30:51,141] cool.pandora.ldpclient.LdpClientImpl:
status code is 200
INFO [2018-02-22 10:30:51,141] cool.pandora.ldpclient.LdpClientImpl:
final request URI is http://localhost:34455/ldp-test-43272e5c-1e3f-
4bb8-8541-fa5ea6d6567a?
predicate=http%3A%2F%2Fwww.w3.org%2Fns%2Foa%23hasBody
INFO [2018-02-22 10:30:51,141] cool.pandora.ldpclient.LdpClientImpl:
Content Length is[3]
这似乎是 jdk.incubator.http 中的错误而不是在 URI 中。
我不清楚在 Exchange 中是否发生了额外的 URI 字符串构建或构造,但如果查询字符串在某处被解码而没有重新编码,这将是我的第一个猜测。
也许有人可以独立验证这一点?
此外,我认为这不是服务器实现,因为使用 curl
的相同请求 URI(在非测试实例上)有效。
172.18.0.1 - - [22/Feb/2018:09:22:31 +0000] "GET /test10?
predicate=http%3A%2F%2Fwww.w3.org%2Fns%2Foa%23hasBody HTTP/1.1" 200
795 "-" "curl/7.55.1" 35
最佳答案
感谢您报告此问题。这确实是 JDK HTTP Client 代码中的一个错误。已归档以下 JIRA 以对其进行跟踪: https://bugs.openjdk.java.net/browse/JDK-8198716
关于http - jdk.incubator.httpclient URI 查询字符串在包含编码的保留字符时被截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48925823/