2015-04-01 25 views
9

Używam API wykresu z Facebooka i nazywam to przez framework wielbłądów. Moje zapytanie nie zawiera znaków ASCII (np. Küçük). Otrzymuję następujący wyjątek: -Znaki spoza ASCII w parametrze adresu URL na wielbłądach

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) 

Czy obsługa wielbłądów nie zawiera znaków ASCII w identyfikatorze URI? Jeśli nie, jakie inne rzeczy można zrobić?

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

Przeczytaj o kodowaniu adresów URL - nie jest to problem związany z Camelem, ale ogólnie reguły dotyczące adresów URL. –

+0

@ClausIbsen Odniosłem się do dokumentu wielbłądziego Apache (http://camel.apache.org/book-getting-started.html). W sekcji "Znaczenie adresu URL, URI, URN i IRI" dokument mówi, że identyfikator URI wielbłąda może obsługiwać litery i cyfry w zestawie znaków ASCII w USA. Czy znasz sposób, w jaki mogę poprosić wielbłąda o użycie IRI lub innych opcji do obsługi znaków specjalnych? –

+0

Mam ten sam problem, każda pomoc jest doceniana. – Sid

Odpowiedz

1

Więc to, co udało nam się zrobić, aby rozwiązać ten problem .

W Apache Camel składnik HTTP_URI nie akceptuje żadnych znaków specjalnych, nawet po ich zakodowaniu. To błąd w Camelu, który nie jest jeszcze zamknięty.

Na szczęście dla nas znaki specjalne pojawiałyby się tylko w ciągu zapytania w adresie URL, a nie w głównej części URI. Camel udostępnia inny komponent HTTP_QUERY, który może z powodzeniem analizować i rozumieć zakodowane znaki UTF-8. Ustawiając go w nagłówku, byliśmy w stanie pozbyć się problemu.

Najpierw zakodowujemy URL do UTF-8, a następnie ustawiamy wartość HTTP_QUERY jako ciąg zapytania. To działało jak urok. np. (Scala)

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

Camel obsługuje znaki specjalne w głównej części adresu URL. Nieprawidłowy problem z identyfikatorem URI występuje, gdy mamy specjalne znaki w części adresu URL zapytania. –

+0

Zgadza się, zmieni moją odpowiedź. – Sid

5

"Kodowanie URL zastępuje znaki spoza ASCII z "%", a następnie cyfr szesnastkowych." (more info here)

Można spróbować to:

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

czy może

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

Dziękuję za odpowiedź, ale to nie pomogło w kontekście camelowym Apache. – Sid

0

Zastosowanie encodeURIComponent(url) będzie działać