2015-09-05 57 views
2

嗨我想通过Retrofit做一个简单的http获取查询。翻新无效URI

我的参数有一些特殊字符,看起来URL编码失败。

原文:

data=[out:json];node["name"~"Karlsruhe"]["place"~"city|village|town"];out body; 

正确的编码应该是这样的:

data=%5Bout%3Ajson%5D%3Bnode%5B%22name%22~%22Karlsruhe%22%5D%5B%22place%22~%22city%7Cvillage%7Ctown%22%5D%3Bout%20body%3B 

但改造创造这样的:

data=[out:json];node[%22name%22~%22Karlsruhe%22][%22place%22~%22city|village|town%22];out%20body; 

,这将失败:

java.lang.IllegalStateException:作为java.net.URI无效: http://overpass.osm.rambler.ru/cgi/interpreter?data=[out:json];node[%22name%22~%22Karlsruhe%22][%22place%22~%22city|village|town%22];out%20body; 在com.squareup.okhttp.HttpUrl.uri(HttpUrl.java:336)在 com.squareup.okhttp.internal.http.RouteSelector.resetNextProxy(RouteSelector.java:135) 在 com.squareup.okhttp.internal .http.RouteSelector。(RouteSelector.java:71) 在 com.squareup.okhttp.internal.http.RouteSelector.get(RouteSelector.java:76) 在 com.squareup.okhttp.internal.http.HttpEngine。在 com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:245) 连接(HttpEngine.java:321) 在com.squareup.okhttp.Call.getResponse(Call.java:267)在 com.squareup.okhttp.Call $ ApplicationInterceptorChain.proceed(Call.java:224)(Call.java:79) retrofit.OkHttpCall.execute(OkHttpCall.java:112) )

在这里可以做些什么来解决这个编码问题? 谢谢

回答

8

我不确定编码错误的根本原因是什么,但是您可以使用参数的encoded参数解决此问题。将参数设置为true表示参数已被编码,因此不要再编码。

在您的服务界面中,将encoded=true添加到您的@Query注释中。类似的东西 -

Call<ResponseBody> getResponse(@Query(value = "data", encoded = true) String data); 

然后,在发送到改造之前自己编码参数。

final String encodedData = URLEncoder.encode(data, "UTF-8"); 
Call<ResponseBody> result = service.getResponse(encodedData); 
+0

这将在OkHttp 2.6.0-SNAPSHOT中修复。 –