防止改造编码我的http请求正文

时间:2014-10-29 17:49:12

标签: java json retrofit

我正在尝试传递以下格式的字符串作为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);
}

4 个答案:

答案 0 :(得分:9)

如果您在请求正文中有一个序列化类(如HashMap)并且您想要阻止编码(就像在vezikon&#39;和我的问题中),您可以使用以下方法创建一个具有禁用转义的自定义Gson: / p>

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

将此转换器传递给您的其他适配器:

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

这样&#34; =&#34;提交时,帖子正文中的字符保持不变。

答案 1 :(得分:7)

要直接回答问题,可以使用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);

答案 2 :(得分:0)

使用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'

答案 3 :(得分:-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