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

2022-09-04 20:39:18

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

答案 1

如果您在请求正文中有一个序列化类(如HashMap),并且想要防止编码(如vezikon和我的问题),则可以使用以下方法创建一个禁用转义的自定义Gson:

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

将此转换器传递到您的 rest 适配器:

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

这样,提交时,帖子正文中的“=”字符保持不变。


答案 2

要直接回答问题,可以使用方法参数类型。更改该值的原因是,Retrofit 将 该值交给 Gson 以便将其编码为 JSON。使用或任何子类将阻止这种行为,基本上告诉Retrofit您将自己处理创建直接请求正文。TypedStringStringTypedStringTypedOutput

但是,该格式的有效负载称为表单 URL 编码。改造对它有原生支持。您的方法声明实际上应如下所示:

@FormUrlEncoded
@POST("/oauth/token")
void getAccessToken(
    @Field("param1") String param1,
    @Field("param2") String param2,
    @Field("param3") String param3,
    Callback<Response> callback);