如何通过OkHttp将查询参数添加到HTTP GET请求?

我使用的是最新的okhttp版本: okhttp-2.3.0.jar

如何在java中的okhttp中向GET请求添加查询参数?

我发现了一个关于android的相关问题 ,但这里没有答案!

正如在另一个答案中提到的,okhttp v2.4提供了新的function,使这成为可能。

见http://square.github.io/okhttp/2.x/okhttp/com/squareup/okhttp/HttpUrl.Builder.html#addQueryParameter-java.lang.String-java.lang.String-



对于当前版本的okhttp, 这是不可能的 , 没有提供可以为您处理此问题的方法 。

接下来最好的事情是构建一个url字符串或一个URL对象(在java.net.URL找到),并自己包含查询,并将其传递给okhttp的请求构建器。

在此处输入图像描述

如您所见,Request.Builder可以使用String或URL。

有关如何构建URL的示例可以在Java中组合URL或URI的惯用方法中找到?

对于okhttp3:

 private static final OkHttpClient client = new OkHttpClient().newBuilder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .build(); public static void get(String url, Mapparams, Callback responseCallback) { HttpUrl.Builder httpBuider = HttpUrl.parse(url).newBuilder(); if (params != null) { for(Map.Entry param : params.entrySet()) { httpBuider.addQueryParameter(param.getKey(),param.getValue()); } } Request request = new Request.Builder().url(httpBuider.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) 

更详细: https : //stackoverflow.com/a/32146909/5247331