2014-10-29 4 views
10

Я пытаюсь передать строку формата ниже как тело запроса на сообщение http.Предотвратите модификацию от кодирования моего тела запроса http

param1=PARAM1&param2=PARAM2&param3=PARAM3 

Но Модифицированная кодирует мое тело, так что = становится \ u003d и & становится \ u0026. И я получаю строку, которая выглядит примерно так:

param1\u003dPARAM1\u0026param2\u003dPARAM2\u0026param3\u003dPARAM3 

Как я могу предотвратить это?

Модифицированный отдых api определяется следующим образом.

public interface RestAPI { 
    @POST("/oauth/token") 
    public void getAccessToken(@Body String requestBody, Callback<Response> response); 
} 

ответ

7

Чтобы ответить на этот вопрос напрямую, вы можете использовать TypedString в качестве типа параметра метода. Причина, по которой изменяется значение, заключается в том, что Retrofit передает String в Gson для кодирования как JSON. Использование TypedString или любого подкласса TypedOutput предотвратит это поведение, в основном говоря о том, что Retrofit будет обрабатывать создание тела прямого запроса самостоятельно.

Однако этот формат полезной нагрузки называется формой URL-кодирования. У него есть поддержка. Ваше объявление метода должно выглядеть на самом деле это:

@FormUrlEncoded 
@POST("/oauth/token") 
void getAccessToken(
    @Field("param1") String param1, 
    @Field("param2") String param2, 
    @Field("param3") String param3, 
    Callback<Response> callback); 
+8

Я пытаюсь использовать тело POST как класс, но некоторые переменные в нем содержат зашифрованные строки типа «66PdGFKsvyyYaVTGJ/nAYQ ==» ... любая идея, как предотвратить знаки = от преобразования в \ u003d – vezikon

8

Если у вас есть упорядоченный класс (как в HashMap) в теле запроса, и вы хотите, чтобы предотвратить кодировку (например, в vezikon и моя проблема), вы можете создать обычай Gson с отключенным побегом с помощью:

Gson gson = new GsonBuilder().disableHtmlEscaping().create(); 

Пройдите этот конвертер для адаптера отдыха:

yourRestAdapter = new RestAdapter.Builder() 
    .setEndpoint(.....) 
    .setClient(.....) 
    .setConverter(new GsonConverter(gson)) 
    .build(); 

Таким образом, символ «=» символы в почтовом теле остаются целыми при отправке.

+0

inretrofit 2, мы можем 't использовать его вот так – Choletski

+2

Ну, этот ответ от Retrofit 1 день, но не можете ли вы использовать его таким же образом в Retrofit 2, как это? (Я его не тестировал): Gson gson = new GsonBuilder(). DisableHtmlEscaping(). Create(); Retrofit retrofit = new Retrofit.Builder(). BaseUrl (BASE_URL) .addConverterFactory (GsonConverterFactory.create (gson)). Client (okHttpClient) .build(); –

+0

Что такое RestAdapter? @ MuratÖgat –

1

Эта проблема может быть устранена с помощью обходного пути.

@POST("yourString") 
Call<YourResponseModel> yourCallMethod(@Query("yourKey") String yourValue, 
              @Query("yourKey") String yourValue, 
              @Query("yourKey") String yourValue); 

Примечание: Не используйте «@FormUrlEncoded» для этого случая.

Reference Here - https://github.com/square/retrofit/issues/1407

0

переоборудование 2 вы можете инициализировать переоснащения с Gson преобразовательного заводом.

val builder = GsonBuilder().disableHtmlEscaping().create() 
val retrofit = Retrofit.Builder() 
     .baseUrl(baseUrl) 
     .addConverterFactory(ScalarsConverterFactory.create()) 
     .addConverterFactory(GsonConverterFactory.create(builder)) 
     .client(monoOkHttpClient()) 
     .build() 

Этот строитель должен удалить экранирование с вашего выхода json.

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