簡體   English   中英

防止改造編碼我的http請求正文

[英]Prevent retrofit from encoding my http request body

我正在嘗試傳遞下面格式的字符串作為http post請求的正文。

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);
}

如果你在請求體中有一個序列化的類(比如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”。

參考這里 - https://github.com/square/retrofit/issues/1407

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM