Intereting Posts
NotificationManager.cancel (id) не работает внутри широковещательного приемника Разъяснение документов для PendingIntent.FLAG_CANCEL_CURRENT Зависимость org.json: json: 20090211 игнорируется для отладки, поскольку она может противоречить внутренней версии, предоставляемой Android Изменение стиля CalendarView Изменение разделителя с помощью setDivider в ListActivity без пользовательского ListView? При использовании режима Immersive с диалогими, nav. Bar снова появляется и меняет размеры моего макета Не удается найти контакты Facebook в RawContacts Разрешение отказа: доступ к сервису ComponentInfo {…} из pid = -1 Как включить строку версии в имя файла при создании Android apk с ant? Где я? – Получить страну Кто-нибудь когда-либо пытался использовать DialerFilter? Не удалось открыть устройство HAX! HAX не работает, и эмулятор запускается в эмуляторе режима эмуляции Предварительный просмотр камеры для TextureView Каков часовой пояс, за которым следует Google Developer Console? Исчезающий разделитель в ListView, когда ArrayAdapter.isEnabled возвращает false

Retrofit2: изменение тела запроса в OkHttp Interceptor

Я использую Retrofit 2 (2.0.0-beta3) с клиентом OkHttp в приложении для Android, и до сих пор все отлично. Но в настоящее время я столкнулся с проблемой с OkHttp Interceptor. Сервер, с которым я общаюсь, принимает текс доступа в теле запроса, поэтому, когда я перехватываю запрос, чтобы добавить токен аутентификации или метод аутентификации Authenticator, когда мне нужно добавить обновленный токен аутентификации, мне необходимо изменить тело запроса для этой цели , Но похоже, что я могу добавлять данные только в заголовки, но не в тело текущего запроса. Код, который я написал до сих пор, выглядит следующим образом:

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

Может ли кто-нибудь указать мне в правильном направлении, как изменить тело запроса, чтобы добавить токен доступа (первый раз или обновлен после обновления токена)? Любой указатель на правильное направление будет оценен.

Solutions Collecting From Web of "Retrofit2: изменение тела запроса в OkHttp Interceptor"

Я использую это, чтобы добавить параметр post к существующим.

  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", "Jurassic@Park.com") .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", "Jurassic@Park.com") .add("tel", "90301171XX") .build(); 

Так как это не может быть написано в комментариях к предыдущему ответу @Fabian, я отправляю это как отдельный ответ. Этот ответ касается как «application / json», так и данных формы.

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