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);