改造无效的URI

app*_*ter 3 java retrofit

嗨,我正在尝试通过简单的http获取查询Retrofit.

我的参数有一些特殊字符,似乎url编码失败.

原版的:

data=[out:json];node["name"~"Karlsruhe"]["place"~"city|village|town"];out body;
Run Code Online (Sandbox Code Playgroud)

正确的编码应如下所示:

data=%5Bout%3Ajson%5D%3Bnode%5B%22name%22~%22Karlsruhe%22%5D%5B%22place%22~%22city%7Cvillage%7Ctown%22%5D%3Bout%20body%3B
Run Code Online (Sandbox Code Playgroud)

但Retrofit创造了这个:

data=[out:json];node[%22name%22~%22Karlsruhe%22][%22place%22~%22city|village|town%22];out%20body;
Run Code Online (Sandbox Code Playgroud)

这将失败:

java.lang.IllegalStateException:作为java.net.URI无效:http://overpass.osm.rambler.ru/cgi/interpreter? data = [out:json]; node [%22name%22〜% 22Karlsruhe% 22] [%22place%〜22%22city |村|镇%22];外出%20body; at com.squareup.okhttp.HttpUrl.uri(HttpUrl.java:336)at com.squareup.okhttp.internal.http.RouteSelector.resetNextProxy(RouteSelector.java:135)at com.squareup.okhttp.internal.http.RouteSelector .(RouteSelector.java:71)com.squareup.okhttp.internal.http.RouteSelector.get(RouteSelector.java:76)at com.squareup.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:321) at com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:245)at com.squareup.okhttp.Call.getResponse(Call.java:267)at com.squareup.okhttp.Call $ ApplicationInterceptorChain.proceed (call.java:224)com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:195)at com.squareup.okhttp.Call.execute(Call.java:79)at retrofit.OkHttpCall.execute(OkHttpCall.的java:112)

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

iag*_*een 10

我不确定编码错误的根本原因是什么,但您可以使用符号的encoded参数来解决它Query.设置参数以true告知改造参数已经编码,因此不要再次编码.

在服务界面中,添加encoded=true@Query注释中.就像是 -

Call<ResponseBody> getResponse(@Query(value = "data", encoded = true) String data);
Run Code Online (Sandbox Code Playgroud)

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

final String encodedData = URLEncoder.encode(data, "UTF-8");
Call<ResponseBody> result = service.getResponse(encodedData);
Run Code Online (Sandbox Code Playgroud)