Предотвратите переоснащение от кодирования моего тела запроса HTTP

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

param1=PARAM1&param2=PARAM2&param3=PARAM3

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

param1\u003dPARAM1\u0026param2\u003dPARAM2\u0026param3\u003dPARAM3

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

Мое переопределение апи определяется следующим образом.

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

Ответ 1

Чтобы ответить на вопрос напрямую, вы можете использовать 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);

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

Ссылка здесь - https://github.com/square/retrofit/issues/1407

Ответ 4

Для Retrofit 2 вы можете инициализировать модификацию с помощью преобразователя Gson factory.

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

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