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

use*_*009 12 java json retrofit

我正在尝试传递下面格式的字符串作为http post请求的正文.

param1=PARAM1&param2=PARAM2&param3=PARAM3
Run Code Online (Sandbox Code Playgroud)

但改装编码我的身体,以便=成为\ u003d和&成为\ u0026.我最终得到一个字符串,实际上看起来像这样:

param1\u003dPARAM1\u0026param2\u003dPARAM2\u0026param3\u003dPARAM3
Run Code Online (Sandbox Code Playgroud)

我怎么能防止这种情况?

我的改造休息api定义如下.

public interface RestAPI {
    @POST("/oauth/token")
    public void getAccessToken(@Body String requestBody, Callback<Response> response);
}
Run Code Online (Sandbox Code Playgroud)

Mur*_*gat 9

如果你在请求体中有一个序列化的类(比如HashMap),并且你想要阻止编码(比如vezikon和我的问题),你可以创建一个带有禁用转义的自定义Gson:

Gson gson = new GsonBuilder().disableHtmlEscaping().create();
Run Code Online (Sandbox Code Playgroud)

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

yourRestAdapter  = new RestAdapter.Builder()
    .setEndpoint(.....)
    .setClient(.....)
    .setConverter(new GsonConverter(gson))
    .build();
Run Code Online (Sandbox Code Playgroud)

这样,帖子正文中的"="字符在提交时保持不变.

  • 好吧,这个答案来自Retrofit 1天,但是你不能像Retrofit 2那样以同样的方式使用它吗?(我还没有测试过):Gson gson = new GsonBuilder().disableHtmlEscaping().create(); Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create(gson)).client(okHttpClient).build(); (2认同)

Jak*_*ton 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);
Run Code Online (Sandbox Code Playgroud)

  • 我正在尝试将body作为类进行POST,但其中的一些变量包含加密字符串,如"66PdGFKsvyyYaVTGJ/nAYQ =="...任何想法如何防止=符号转换为\ u003d (11认同)