骆驼 URL 参数中的非 ascii 字符

Non ascii characters in URL param in camel

我正在使用 Facebook 的图表 API,我通过 camel 框架调用它。我的查询包含非 ASCII 字符(例如 küçük)。我收到以下异常:-

Cause: 
org.apache.commons.httpclient.URIException: Invalid query
at org.apache.commons.httpclient.URI.parseUriReference(URI.java:2049)
at org.apache.commons.httpclient.URI.<init>(URI.java:147)
at org.apache.commons.httpclient.HttpMethodBase.getURI
at org.apache.commons.httpclient.HttpClient.executeMethod
at org.apache.commons.httpclient.HttpClient.executeMethod
at org.apache.camel.component.http.HttpProducer.executeMethod
at org.apache.camel.component.http.HttpProducer.process
at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)
at org.apache.camel.processor.SendProcessor.doInAsyncProducer(SendProcessor.java:122)

camel 是否支持 URI 中的非 ASCII 字符?如果不行,还有什么可以做的?

example URL: https://graph.facebook.com/?ids=http://www.example.com/küçük

"URL encoding replaces non ASCII characters with a "%" 后跟十六进制数字。" (more info here)

你可以试试这个:

URL url = new URL(uri.toASCIIString()); 

或者也许

String xstr = URLEncoder.encode("维", "utf-8");

使用encodeURIComponent(url)它会起作用

这就是我们能够解决问题的方法。

在 Apache Camel 中,HTTP_URI 组件不接受任何特殊字符,即使在对它们进行编码之后也是如此。这是 Camel 中的一个错误,尚未关闭。

对我们来说幸运的是,特殊字符只会出现在 URL 的查询字符串中,而不是主要的 URI 部分。 Camel 提供了另一个组件 HTTP_QUERY,可以成功解析和理解编码的 UTF-8 字符。通过在页眉中设置它,我们能够解决这个问题。

所以基本上首先我们将 URL 编码为 UTF-8,然后将 HTTP_QUERY 值设置为查询字符串。这很有效。 例如(斯卡拉)

.setHeader(Exchange.HTTP_QUERY, _.in[HttpRequest].uri.split(?).head)
.setHeader(Exchange.HTTP_URI, _.in[HttpRequest].uri)