squareup headers android retrofit okhttp

android - headers - okhttp3



Retrofit2: Modificación del cuerpo de la solicitud en OkHttp Interceptor (2)

Estoy usando Retrofit 2 (2.0.0-beta3) con el cliente OkHttp en la aplicación de Android y hasta ahora todo va bien. Pero actualmente estoy enfrentando un problema con OkHttp Interceptor. El servidor con el que me estoy comunicando está tomando el token de acceso en el cuerpo de la solicitud, de modo que cuando intercepto la solicitud para agregar el token de autenticación o en el método de autenticación del Autentificador cuando necesito agregar el token de autenticación actualizado, debo modificar el cuerpo de la solicitud para este fin . Pero parece que solo puedo agregar datos en los encabezados pero no en el cuerpo de la solicitud en curso. El código que he escrito hasta ahora es el siguiente:

client.interceptors().add(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); if (UserPreferences.ACCESS_TOKEN != null) { // need to add this access token in request body as encoded form field instead of header request = request.newBuilder() .header("access_token", UserPreferences.ACCESS_TOKEN)) .method(request.method(), request.body()) .build(); } Response response = chain.proceed(request); return response; } });

¿Alguien puede indicarme la dirección correcta como modificar el cuerpo de la solicitud para agregar mi token de acceso (por primera vez o actualizado después de la actualización del token)? Cualquier puntero a la dirección correcta sería apreciado.


Utilizando esto para agregar el parámetro post a los existentes.

OkHttpClient client = new OkHttpClient.Builder() .protocols(protocols) .addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Request.Builder requestBuilder = request.newBuilder(); RequestBody formBody = new FormEncodingBuilder() .add("email", "[email protected]") .add("tel", "90301171XX") .build(); String postBodyString = Utils.bodyToString(request.body()); postBodyString += ((postBodyString.length() > 0) ? "&" : "") + Utils.bodyToString(formBody); request = requestBuilder .post(RequestBody.create(MediaType.parse("application/x-www-form-urlencoded;charset=UTF-8"), postBodyString)) .build(); return chain.proceed(request); } }) .build(); public static String bodyToString(final RequestBody request){ try { final RequestBody copy = request; final Buffer buffer = new Buffer(); if(copy != null) copy.writeTo(buffer); else return ""; return buffer.readUtf8(); } catch (final IOException e) { return "did not work"; } }

Okhttp3:

RequestBody formBody = new FormBody.Builder() .add("email", "[email protected]") .add("tel", "90301171XX") .build();


Ya que esto no se puede escribir en los comentarios de la respuesta anterior de @Fabian, estoy publicando esta como respuesta por separado. Esta respuesta trata tanto de "application / json" como de los datos del formulario.

import android.content.Context; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import okhttp3.FormBody; import okhttp3.Interceptor; import okhttp3.MediaType; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import okio.Buffer; /** * Created by debanjan on 16/4/17. */ public class TokenInterceptor implements Interceptor { private Context context; //This is here because I needed it for some other cause //private static final String TOKEN_IDENTIFIER = "token_id"; public TokenInterceptor(Context context) { this.context = context; } @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); RequestBody requestBody = request.body(); String token = "toku";//whatever or however you get it. String subtype = requestBody.contentType().subtype(); if(subtype.contains("json")){ requestBody = processApplicationJsonRequestBody(requestBody, token); } else if(subtype.contains("form")){ requestBody = processFormDataRequestBody(requestBody, token); } if(requestBody != null) { Request.Builder requestBuilder = request.newBuilder(); request = requestBuilder .post(requestBody) .build(); } return chain.proceed(request); } private String bodyToString(final RequestBody request){ try { final RequestBody copy = request; final Buffer buffer = new Buffer(); if(copy != null) copy.writeTo(buffer); else return ""; return buffer.readUtf8(); } catch (final IOException e) { return "did not work"; } } private RequestBody processApplicationJsonRequestBody(RequestBody requestBody,String token){ String customReq = bodyToString(requestBody); try { JSONObject obj = new JSONObject(customReq); obj.put("token", token); return RequestBody.create(requestBody.contentType(), obj.toString()); } catch (JSONException e) { e.printStackTrace(); } return null; } private RequestBody processFormDataRequestBody(RequestBody requestBody, String token){ RequestBody formBody = new FormBody.Builder() .add("token", token) .build(); String postBodyString = bodyToString(requestBody); postBodyString += ((postBodyString.length() > 0) ? "&" : "") + bodyToString(formBody); return RequestBody.create(requestBody.contentType(), postBodyString); } }