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

How to add query parameters to a HTTP GET request by OkHttp?

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

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

我找到了一个关于 android 的 related question,但这里没有答案!

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

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



当前版本的 okhttp 无法做到这一点,there is no method provided that will handle this for you

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

如您所见,Request.Builder 可以采用字符串或 URL。

有关如何构建 url 的示例可在 What is the idiomatic way to compose a URL or URI in Java?

中找到

截至目前 (okhttp 2.4),HttpUrl.Builder 现在有方法 addQueryParameter 和 addEncodedQueryParameter。

使用 HttpUrl class 的功能:

//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)

更详细:

这是我的拦截器

    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);
    }
}

您可以从现有的 HttoUrl 创建一个 newBuilder 并在其中添加查询参数。示例拦截器代码:

    Request req = it.request()
    return chain.proceed(
        req.newBuilder()
            .url(
                req.url().newBuilder()
                .addQueryParameter("v", "5.60")
                .build());
    .build());

对于 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);
}

我终于完成了我的代码,希望下面的代码可以帮助到你们。我首先使用

构建 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();
    }
}