嗨,我正在尝试通过简单的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)
| 归档时间: |
|
| 查看次数: |
1197 次 |
| 最近记录: |