2016-11-11 1 views
1

Я пытаюсь вычислить контрольную сумму из аргументов HTTP динамически. И тогда я хотел бы добавить эту контрольную сумму в качестве аргумента HTTP.Есть ли способ получить в параметрах post request во время процесса сборки в Retrofit2.1.0?

Мне нужно сначала получить поля, которые передаются в качестве параметров, но похоже, что модификация может только запрашивать параметры запроса url.

@Gordak показывает способ получить параметр запроса, но то, что я хочу достичь, если возможно, для получения параметров сообщения в цепочке запросов.

+1

Первое, давайте посмотрим, если я хорошо вас понял. Для меня вы пытаетесь вычислить контрольную сумму из своих HTTP-аргументов динамически. И тогда вы хотели бы добавить эту контрольную сумму в качестве аргумента HTTP. Это верно ? – Gordak

+0

@Gordak точно, вот что я имею в виду: – Qin

ответ

1

Хорошо, здесь мы идем.

Сначала создайте свой клиент OkHTTP и обновите объект.

 OkHttpClient client = httpBuilder 
       .addNetworkInterceptor(INTERCEPTOR_REQUEST_ADD_CHECKSUM) 
       .build(); 

     Retrofit retrofit = new Retrofit.Builder() 
       .addConverterFactory(GsonConverterFactory.create()) 
       .client(client) 
       .baseUrl("https://my.domain.com") 
       .build(); 

Затем вам нужно определить свой перехватчик:

private static final Interceptor INTERCEPTOR_REQUEST_ADD_CHECKSUM = new Interceptor() { 
     @Override 
     public Response intercept(Interceptor.Chain chain) throws IOException { 
      HttpUrl url = chain.request().url(); 
      String param1 = url.queryParameter("param1"); 
      String param2 = url.queryParameter("param2"); 
      String chk = aMethodToComputeChecksum(param1,param2); 

      url = url.newBuilder().addQueryParameter("checksum", chk).build(); 
      Request request = chain.request().newBuilder().url(url).build(); 
      return chain.proceed(request); 
     } 
+0

, потому что некоторые имена параметров изменены для разных API-интерфейсов, я буду использовать queryParameterNames, чтобы получить все ключи, а затем получить их значения, потому что этот метод начинается с запроса, я пропустил эти методы в начале, я позже проверю, извлекает ли он параметры из тела запроса – Qin

+0

Да. Затем просто передайте массив (или список) строк для метода, который вычисляет вашу контрольную сумму;) – Gordak

+0

извините за позднюю обратную связь, но, похоже, нет способа получить параметры сообщений, которые встроены в RequestBody в цепочке запросов. – Qin

0

Может быть, это поможет - попытаться вычислить этот параметр один раз и записать его в RequestInterceptor

+0

retrofit2 использует Interceptor вместо RequestInterceptor, это то, что я думал, я хотел бы вычислить один раз, но fix args может это сделать, переданные в args не известны на этом piont, за исключением того, что есть способ получить параметры запроса во время процесса перехвата – Qin