web-dev-qa-db-fra.com

Comment ajouter des paramètres de requête à une requête HTTP GET par OkHttp?

J'utilise la dernière version de okhttp: okhttp-2.3.0.jar

Comment ajouter des paramètres de requête à la requête GET dans okhttp dans Java?

J'ai trouvé une question connexe à propos d'Android, mais pas de réponse ici!

28
Jerikc XIONG

Comme mentionné dans l'autre réponse, okhttp v2.4 offre une nouvelle fonctionnalité qui rend cela possible.

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



Ce n'est pas possible avec la version actuelle de okhttp, il n'y a pas de méthode fournie pour gérer cela pour vous .

La meilleure chose à faire est de créer une chaîne d’URL ou un objet URL (trouvé dans Java.net.URL) avec la requête incluse et transmettez-la au constructeur de requêtes de okhttp.

enter image description here

Comme vous pouvez le constater, Request.Builder peut prendre une chaîne ou une URL.

Des exemples sur la façon de construire une URL peuvent être trouvés à Quelle est la façon idiomatique de composer une URL ou une URI en Java?

10
Tim Castelijns

Pour 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 httpBuider = HttpUrl.parse(url).newBuilder();
    if (params != null) {
       for(Map.Entry<String, String> param : params.entrySet()) {
           httpBuider.addQueryParameter(param.getKey(),param.getValue());
       }
    }
    Request request = new Request.Builder().url(httpBuider.build()).build();
    client.newCall(request).enqueue(responseCallback);
}
34
Yun CHEN

Voici mon intercepteur

    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);
    }
}
19
Louis CAD

J'ai finalement créé mon code, j'espère que le code suivant pourra vous aider. Je construis d'abord l'URL en utilisant

HttpUrl httpUrl = new HttpUrl.Builder()

Puis passez l'URL à Request requesthttp J'espère que ça aide .

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();
    }
}
8
marcode_ely

À partir de maintenant (okhttp 2.4), HttpUrl.Builder a maintenant les méthodes addQueryParameter et addEncodedQueryParameter.

4
Sofi Software LLC

Vous pouvez créer un newBuilder à partir de HttoUrl existant et y ajouter des paramètres de requête. Exemple de code d'intercepteur:

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