在进行Apache HttpClient调用时出现URI异常

时间:2012-12-27 21:29:45

标签: java base64 uri apache-httpclient-4.x

我正在使用Apache HttpClient v4.2.2来尝试点击一个网址,并且得到一个我似乎无法弄明白的URISyntaxException

try {
    String uri = "http://a.example.com/12/allrigh/bouncer?my_key1=i[(Gz$xrCcCeaCrHv}[5Ryou4kz@Yh~c@K_if-p7vGQ3ZF[fEpm2SmH(Z6Yh40Ea";

    HttpClient httpClient = new DefaultHttpClient();
    HttpGet httpGet = new HttpGet(uri);
    HttpResponse response = httpClient.execute(httpGet);
} catch(Throwable throwable) {
    // Log & handle
}

Exception in thread "main" java.lang.IllegalArgumentException
    at java.net.URI.create(URI.java:859)
    at org.apache.http.client.methods.HttpGet.<init>(HttpGet.java:69)
    ...
Caused by: java.net.URISyntaxException: Illegal character in query at index 65: http://a.example.com/12/allrigh/bouncer?my_key1=i[(Gz$xrCcCeaCrHv}[5Ryou4kz@Yh~c@K_if-p7vGQ3ZF[fEpm2SmH(Z6Yh40Ea
    at java.net.URI$Parser.fail(URI.java:2825)
    at java.net.URI$Parser.checkChars(URI.java:2998)
    at java.net.URI$Parser.parseHierarchical(URI.java:3088)
    at java.net.URI$Parser.parse(URI.java:3030)
    at java.net.URI.<init>(URI.java:595)
    at java.net.URI.create(URI.java:857)
    ... 6 more

据我所知,第65个字符是“H”......所以这里发生了什么?!?除了弄清楚我的URI有什么问题外,下一个显而易见的问题是:我该怎么做才能解决这个问题?我需要对URI进行base-64编码吗?如果是这样,怎么样?提前谢谢!

1 个答案:

答案 0 :(得分:1)

我不太明白如何计算字符以及索引65的位置。但是,您网址中的无效字符是大括号(请参阅https://stackoverflow.com/a/7109208/413337)。

为什么您的网址如下所示?这些花括号来自哪里?

您不能对查询参数进行Base64编码,除非服务器期望它。此外,查询参数看起来好像是Base64编码的。但是Base64编码的常规字符集不是URL安全的。

编码查询参数的URL可能会有所帮助。请参阅URLEncoder.encode(String, String)