¿Cómo agregar parámetros de consulta a una solicitud HTTP GET de OkHttp?

3 minutos de lectura

Avatar de usuario de Jerikc XIONG
Jerikc XIONG

Estoy usando la última versión de okhttp: okhttp-2.3.0.jar

¿Cómo agregar parámetros de consulta a la solicitud GET en okhttp en java?

Encontré una pregunta relacionada con Android, ¡pero no hay respuesta aquí!

Avatar de usuario de Yun CHEN
yun chen

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

Avatar de usuario de Louis CAD
Luis CAD

Aquí está mi interceptor

    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().url()
                .newBuilder()
                .addQueryParameter("api_key", mApiKey)
                .build();
        Request request = chain.request().newBuilder().url(url).build();
        return chain.proceed(request);
    }
}

Finalmente hice mi código, espero que el siguiente código pueda ayudarlos. Primero construyo la URL usando

HttpUrl httpUrl = new HttpUrl.Builder()

Luego pasa la URL a Request requesthttp Espero eso ayude .

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

Avatar de usuario de Tim
Tim

Como se mencionó en la otra respuesta, okhttp v2.4 ofrece una nueva funcionalidad que lo hace posible.

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



Esto no es posible con la versión actual de okhttp, no se proporciona ningún método que maneje esto por usted.

Lo siguiente mejor es construir una cadena de URL o un URL objeto (encontrado en java.net.URL) con la consulta incluida, y pásela al generador de solicitudes de okhttp.

ingrese la descripción de la imagen aquí

Como puede ver, Request.Builder puede tomar una cadena o una URL.

Se pueden encontrar ejemplos sobre cómo crear una URL en ¿Cuál es la forma idiomática de componer una URL o URI en Java?

A partir de ahora (okhttp 2.4), HttpUrl.Builder ahora tiene métodos addQueryParameter y addEncodedQueryParameter.

Avatar de usuario de Miha_x64
miha_x64

Puede crear un newBuilder a partir de HttoUrl existente y agregar allí parámetros de consulta. Ejemplo de código de interceptor:

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

Avatar de usuario de BaiJiFeiLong
BaiJiFeiLong

Ejemplo de una línea:

assert HttpUrl.parse("https://httpbin.org/get")
        .newBuilder()
        .addQueryParameter("hello", "world")
        .build()
        .equals("https://httpbin.org/get?hello=world");

¿Ha sido útil esta solución?