Java 改装无效的URI
您好,我正在尝试通过Java 改装无效的URI,java,retrofit,Java,Retrofit,您好,我正在尝试通过改型执行一个简单的http get查询 我的参数有一些特殊字符,似乎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%
改型
执行一个简单的http get查询
我的参数有一些特殊字符,似乎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无效:
;
位于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.connect(HttpEngine.java:321)
在
com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:245)
在com.squareup.okhttp.Call.getResponse(Call.java:267)的
com.squareup.okhttp.Call$ApplicationInterceptorChain.procedure(Call.java:224)
在
com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:195)
在com.squareup.okhttp.Call.execute(Call.java:79)中
execute(OkHttpCall.java:112)
这里可以做些什么来解决这个编码问题?
谢谢我不确定编码错误的根本原因是什么,但您可以使用符号中的
encoded
参数来解决这个问题。将参数设置为true
表示该参数已编码,因此不要再次编码
在服务界面中,将encoded=true
添加到@Query
注释中。比如——
调用getResponse(@Query(value=“data”,encoded=true)字符串数据);
然后,在发送到改装之前,自己对参数进行编码
final String encodedData = URLEncoder.encode(data, "UTF-8");
Call<ResponseBody> result = service.getResponse(encodedData);
final String encodedData=urlcoder.encode(数据,“UTF-8”);
调用结果=service.getResponse(encodedData);
这将在OkHttp 2.6.0-SNAPSHOT中修复。
final String encodedData = URLEncoder.encode(data, "UTF-8");
Call<ResponseBody> result = service.getResponse(encodedData);