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

j'utilise la dernière version d'okhttp: okhttp-2.3.0.jar

comment ajouter des paramètres de requête pour obtenir une requête dans okhttp en java ?

j'ai trouvé un question liée à propos d'android, mais aucune réponse ici!

22
demandé sur Community 2015-05-09 19:53:48

7 réponses

comme mentionné dans l'autre réponse, okhttp v2.4 offre de nouvelles fonctionnalités qui rendent cela possible.

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



cela n'est pas possible avec la version actuelle d'okhttp, il n'y a pas de méthode à condition que prends ça pour toi .

la meilleure chose suivante est de construire une chaîne d'url ou un URL objet (trouvé dans java.net.URL ) avec la requête inclus vous-même, et passer que pour le constructeur de requête d'okhttp.

enter image description here

comme vous pouvez le voir, la demande.Builder peut prendre une chaîne ou une URL.

des exemples sur la façon de construire une url peuvent être trouvés à Qu'est-ce que le façon idiomatique de composer une URL ou un URI en Java?

9
répondu Tim Castelijns 2017-05-23 12:17:50

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);
}
21
répondu Yun CHEN 2017-03-26 13:00:30

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);
    }
}
18
répondu Louis CAD 2015-10-11 12:10:46

j'ai enfin fait 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 passer l'URL à Request requesthttp espérons que cela 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();
    }
}
7
répondu marcode_ely 2018-01-17 15:36:59

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

4
répondu Sofi Software LLC 2015-06-17 19:39:55

vous pouvez créer un nouveau builder à partir de HttoUrl existant et y ajouter des paramètres de requête. Exemple de code d'interception:

    Request req = it.request()
    return chain.proceed(
        req.newBuilder()
            .url(
                req.url().newBuilder()
                .addQueryParameter("v", "5.60")
                .build());
    .build());
1
répondu Miha_x64 2017-01-13 10:07:23

utiliser les fonctions de la classe 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)

plus détaillé: https://stackoverflow.com/a/32146909/5247331

-1
répondu Vitaly Zinchenko 2017-05-23 12:25:58