[英]Prevent retrofit from encoding my http request body
我正在嘗試傳遞下面格式的字符串作為http post請求的正文。
param1=PARAM1¶m2=PARAM2¶m3=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);
}
如果你在請求體中有一個序列化的類(比如HashMap),並且你想要阻止編碼(比如vezikon和我的問題),你可以創建一個帶有禁用轉義的自定義Gson:
Gson gson = new GsonBuilder().disableHtmlEscaping().create();
將此轉換器傳遞給您的其他適配器:
yourRestAdapter = new RestAdapter.Builder()
.setEndpoint(.....)
.setClient(.....)
.setConverter(new GsonConverter(gson))
.build();
這樣,帖子正文中的“=”字符在提交時保持不變。
要直接回答問題,可以使用TypedString
作為方法參數類型。 值被更改的原因是因為Retrofit將String
交給Gson以便編碼為JSON。 使用TypedString
或任何TypedOutput
子類將阻止此行為,基本上告訴Retrofit您將自己處理創建直接請求正文。
但是,該有效載荷格式稱為表單URL編碼。 Retrofit對它有本機支持。 您的方法聲明應該看起來像這樣:
@FormUrlEncoded
@POST("/oauth/token")
void getAccessToken(
@Field("param1") String param1,
@Field("param2") String param2,
@Field("param3") String param3,
Callback<Response> callback);
使用Kotlin
對於Retrofit 2,您可以使用Gson轉換器工廠初始化改造。
val builder = GsonBuilder().disableHtmlEscaping().create()
val retrofit = Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create(builder))
.client(monoOkHttpClient())
.build()
此構建器應刪除從json輸出中轉義。
Gradle文件依賴項:
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.1.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
可以通過以下解決方法修復此問題。
@POST("yourString")
Call<YourResponseModel> yourCallMethod(@Query("yourKey") String yourValue,
@Query("yourKey") String yourValue,
@Query("yourKey") String yourValue);
注意:在這種情況下,請勿使用“@FormUrlEncoded”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.