Предотвратите переоснащение от кодирования моего тела запроса HTTP
Я пытаюсь передать строку формата ниже как тело запроса на отправку http.
param1=PARAM1¶m2=PARAM2¶m3=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-вывода.