我正在处理一个 api,我需要在其中提供一个 JSON 数组作为 POST 请求中的查询参数。引用必须在 url 中,但 OkHttp 和 HttpURL 一直将其转换为 %22
。 API 将无法识别并返回错误代码。如何让 OkHttp 保留请求中的报价。我正在处理的代码如下所示:
public static void post(String url, String[][] requestParams, Callback callback) {
HttpUrl httpUrl = addParamsToURL(getAbsoluteUrl(url), requestParams);
Request request = new Request.Builder()
.url(httpUrl)
.addHeader("app", Prefs.getString(Constants.HEADER_APP, null))
.addHeader("authoToken", Prefs.getString(Constants.HEADER_AUTH_TOKEN, null))
.post(RequestBody.create(MediaType.parse("application/json"), ""))
.build();
okHttpClient.newCall(request).enqueue(callback);
}
private static HttpUrl addParamsToURL(String url, String[][] requestParams) {
HttpUrl httpUrl = HttpUrl.parse(url);
HttpUrl.Builder urlBuilder = httpUrl.newBuilder();
for(int i = 0, size = requestParams.length; i < size; i++ ) {
urlBuilder.addEncodedQueryParameter(requestParams[i][0], requestParams[i][1]);
}
return urlBuilder.build();
}
我需要请求转到的 url 看起来像 https://www.baseurl.com/path?queryName=["email@domain.com"]
但它看起来像 https://www.baseurl.com/path/?queryName=[%22email@domain.com%22]
最佳答案
修复服务器。 OkHttp 与所有在查询字符串中将 "
编码为 %22
的网络浏览器一致。
Chrome :
GET /?a=[%22email@domain.com%22] HTTP/1.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
火狐:
GET /?a=[%22email@domain.com%22] HTTP/1.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:52.0) Gecko/20100101 Firefox/52.0
Safari
GET /?a=[%22email@domain.com%22] HTTP/1.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/602.4.8 (KHTML, like Gecko) Version/10.0.3 Safari/602.4.8
关于android - 如何使用 OkHttp 保留双引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42912039/