2015-04-01 25 views
9

我使用Facebook的圖形API,並通過駱駝框架調用它。我的查詢有非ASCII字符(例如küçük)。我收到以下例外情況: -URL中的非ASCII字符參數駝峯

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$2.doInAsyncProducer(SendProcessor.java:122) 

駱駝是否支持URI中的非ASCII字符?如果不是,還可以做其他什麼事情? 「

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

閱讀關於url編碼 - 它不是駱駝特定的問題,而是一般的URL規則。 – 2015-04-02 06:53:34

+0

@ClausIbsen 我提到了Apache camel文檔(http://camel.apache.org/book-getting-started.html)。在「URL,URI,URN和IRI的含義」一節中,文檔稱駱駝URI可以支持US ASCII字符集中的字母和數字。你知道我可以讓駱駝使用IRI或其他選項來支持特殊字符嗎? – 2015-04-07 05:29:17

+0

我有同樣的問題,任何幫助表示讚賞。 – Sid 2015-04-16 07:32:40

回答

1

因此,這是我們能夠做些什麼來解決這個問題。

在Apache Camel中,HTTP_URI組件不接受任何特殊字符,即使在對它們進行編碼之後。這是駱駝尚未關閉的錯誤。

幸運的是,特殊字符只會出現在URL的查詢字符串中,而不是主要的URI部分。 Camel提供了另一個組件HTTP_QUERY,它可以成功解析和理解編碼的UTF-8字符。通過在標題中設置它,我們可以擺脫這個問題。

所以基本上我們首先將URL編碼爲UTF-8,然後將HTTP_QUERY值設置爲查詢字符串。這就像魅力一樣。 例如(Scala)

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

駱駝在URL的主要部分支持特殊字符。當我們在URL的查詢部分中有特殊字符時,會出現無效的URI問題。 – 2015-04-27 06:28:30

+0

沒錯,會編輯我的答案。 – Sid 2015-04-27 09:41:22

5

」網址編碼將非ASCII字符替換爲後跟十六進制數字的「%」。「 (more info here

你可以試試這個:

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

也許

String xstr = URLEncoder.encode("維", "utf-8"); 
+0

感謝您的回覆,但這在Apache駱駝環境中沒有幫助。 – Sid 2015-04-24 10:06:37

0

使用encodeURIComponent(url)它會工作