我正在使用最新的okhttp版本:okhttp-2.3.0.jar
如何在Java的okhttp中向GET请求添加查询参数?
我找到了一个有关Android的related question,但这里没有答案!
如另一个答案中所述,okhttp v2.4提供了使之成为可能的新功能。
这在okhttp的当前版本there is no method provided that will handle this for you中是不可能的。
下一个最好的方法是构建一个包含查询的URL字符串或URL
对象(在java.net.URL
中找到),并将其传递给okhttp的请求生成器。
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9WV1pDMC5wbmcifQ==” alt =“在此处输入图像描述”>
您可以看到,Request.Builder可以使用字符串或URL。
有关如何构建URL的示例,请参见What is the idiomatic way to compose a URL or URI in Java?
对于okhttp3:
private static final OkHttpClient client = new OkHttpClient().newBuilder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build();
public static void get(String url, Map<String,String>params, Callback responseCallback) {
HttpUrl.Builder httpBuilder = HttpUrl.parse(url).newBuilder();
if (params != null) {
for(Map.Entry<String, String> param : params.entrySet()) {
httpBuilder.addQueryParameter(param.getKey(),param.getValue());
}
}
Request request = new Request.Builder().url(httpBuilder.build()).build();
client.newCall(request).enqueue(responseCallback);
}
这是我的拦截器
private static class AuthInterceptor implements Interceptor {
private String mApiKey;
public AuthInterceptor(String apiKey) {
mApiKey = apiKey;
}
@Override
public Response intercept(Chain chain) throws IOException {
HttpUrl url = chain.request().httpUrl()
.newBuilder()
.addQueryParameter("api_key", mApiKey)
.build();
Request request = chain.request().newBuilder().url(url).build();
return chain.proceed(request);
}
}
我终于完成了代码,希望以下代码可以对您有所帮助。我首先使用
构建URL
HttpUrl httpUrl = new HttpUrl.Builder()
然后将URL传递给Request requesthttp
希望对您有所帮助。
public class NetActions {
OkHttpClient client = new OkHttpClient();
public String getStudentById(String code) throws IOException, NullPointerException {
HttpUrl httpUrl = new HttpUrl.Builder()
.scheme("https")
.host("subdomain.apiweb.com")
.addPathSegment("api")
.addPathSegment("v1")
.addPathSegment("students")
.addPathSegment(code) // <- 8873 code passthru parameter on method
.addQueryParameter("auth_token", "71x23768234hgjwqguygqew")
// Each addPathSegment separated add a / symbol to the final url
// finally my Full URL is:
// https://subdomain.apiweb.com/api/v1/students/8873?auth_token=71x23768234hgjwqguygqew
.build();
System.out.println(httpUrl.toString());
Request requesthttp = new Request.Builder()
.addHeader("accept", "application/json")
.url(httpUrl) // <- Finally put httpUrl in here
.build();
Response response = client.newCall(requesthttp).execute();
return response.body().string();
}
}
截至目前(okhttp 2.4),HttpUrl.Builder现在具有方法addQueryParameter和addEncodedQueryParameter。
您可以从现有的HttoUrl创建newBuilder并在其中添加查询参数。示例拦截器代码:
Request req = it.request()
return chain.proceed(
req.newBuilder()
.url(
req.url().newBuilder()
.addQueryParameter("v", "5.60")
.build());
.build());
使用HttpUrl类的功能:
//adds the pre-encoded query parameter to this URL's query string
addEncodedQueryParameter(String encodedName, String encodedValue)
//encodes the query parameter using UTF-8 and adds it to this URL's query string
addQueryParameter(String name, String value)