2015-10-07 4 views
1

До сих пор я использовал OkHttp для своих сетевых запросов, но теперь я хочу использовать Retrofit (v2) для использования. Сервер, с которым я общаюсь, требует AuthToken либо как часть URL-адреса (запрос GET), либо внутри тела (запрос POST). Мне также нужно отделить создание запросов от выполнения, что является очень хорошей функцией Retrofit. Я могу передать объект Call и выполнить его/позже.Изменение запроса POST Тело при использовании Дооснащение/OkHttp

Жесткая часть заключается в том, что AuthToken может быть недоступен при создании запроса, и мне нужно будет его модифицировать, прежде чем он будет выполнен. До сих пор я добавлял фиктивный authToken во время создания и заменяю перед выполнением. Это довольно просто для запроса GET, поскольку я могу добавить Interceptor в OkHttpClient, чтобы изменить URL-адрес запроса, но изменение тела запроса POST - это то, с чем я борюсь.

Итак, есть ли поддержка для этого варианта использования в модификации/OkHttp?

Некоторые не работает пример кода, который будет практически сделать трюк (пытается добавить authToken всегда при наличии, заканчивается: java.lang.IllegalStateException: Не могу течь в тело запроса без фрагментированного кодирования или известной длиной контента

client.networkInterceptors().add(new Interceptor() { 
     @Override 
     public Response intercept(Chain chain) throws IOException { 
      Request request = chain.request(); 

      if (request.body() == null) { 
       return chain.proceed(request); 
      } 

      Request authorizedRequest = request.newBuilder() 
        .method(request.method(), replaceDummyAuth(request.body())) 
        .build(); 
      return chain.proceed(authorizedRequest); 
     } 

     private RequestBody replaceDummyAuth(final RequestBody body) { 
      return new RequestBody() { 
       @Override 
       public MediaType contentType() { 
        return body.contentType(); 
       } 

       @Override 
       public long contentLength() throws IOException { 
        return -1; 
       } 

       @Override 
       public void writeTo(BufferedSink sink) throws IOException { 
        ParametersMap map = new ParametersMap(); 

        BufferedSink authSink = Okio.buffer(sink); 
        body.writeTo(authSink); 

        String authToken = SessionManager.getAuthToken(); 
        if(StringUtils.hasText(authToken)) { 
         map.put("authToken", authToken); 
         String paramString = map.getParameterString(); 
         authSink.write(paramString.getBytes("UTF-8")); 
        } 
        authSink.close(); 
       } 
      }; 
     } 
    }); 
+0

Почему длина содержания -1? является ли она архивированная? –

+0

нет, это не gzipped, я просто не знаю, как реализовать contentLength(). Если я поставлю: return body.contentLength(); t "java.net.ProtocolException: ожидается 0 байт, но получено 111" – pmellaaho

ответ

Смежные вопросы