Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 防止对我的http请求正文进行编码改造_Java_Json_Retrofit - Fatal编程技术网

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

Java 防止对我的http请求正文进行编码改造,java,json,retrofit,Java,Json,Retrofit,我正在尝试将以下格式的字符串作为http post请求的主体传递 param1=PARAM1&param2=PARAM2&param3=PARAM3 但是改型对我的身体进行编码,使=变成\u003d,&变成\u0026。最后我得到了一个字符串,它实际上是这样的: param1\u003dPARAM1\u0026param2\u003dPARAM2\u0026param3\u003dPARAM3 @FormUrlEncoded @POST("/oauth/token") voi

我正在尝试将以下格式的字符串作为http post请求的主体传递

param1=PARAM1&param2=PARAM2&param3=PARAM3
但是改型对我的身体进行编码,使=变成\u003d,&变成\u0026。最后我得到了一个字符串,它实际上是这样的:

param1\u003dPARAM1\u0026param2\u003dPARAM2\u0026param3\u003dPARAM3
@FormUrlEncoded
@POST("/oauth/token")
void getAccessToken(
    @Field("param1") String param1,
    @Field("param2") String param2,
    @Field("param3") String param3,
    Callback<Response> callback);
我怎样才能防止呢

我的改造RESTAPI定义如下

公共接口{
@POST(“/oauth/token”)
public void getAccessToken(@Body String requestBody,回调响应);
}

要直接回答问题,可以使用
TypedString
作为方法参数类型。更改该值的原因是因为改型将
字符串
传递给Gson,以便将其编码为JSON。使用
TypedString
或任何
TypedOutput
子类都会阻止这种行为,基本上告诉改型您将自己创建直接请求主体

然而,这种有效负载的格式称为表单URL编码。改造具有对它的本地支持。您的方法声明实际上应该如下所示:

param1\u003dPARAM1\u0026param2\u003dPARAM2\u0026param3\u003dPARAM3
@FormUrlEncoded
@POST("/oauth/token")
void getAccessToken(
    @Field("param1") String param1,
    @Field("param2") String param2,
    @Field("param3") String param3,
    Callback<Response> callback);
@FormUrlEncoded
@POST(“/oauth/token”)
无效getAccessToken(
@字段(“param1”)字符串param1,
@字段(“param2”)字符串param2,
@字段(“param3”)字符串param3,
回调(回调);

如果您在请求正文中有一个序列化类(如HashMap),并且希望防止对其进行编码(如在vezikon和my problem中),您可以使用以下方法创建一个禁用转义的自定义Gson:

Gson gson = new GsonBuilder().disableHtmlEscaping().create();
将此转换器传递到rest适配器:

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

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

此问题可以通过以下解决方法解决

@POST("yourString")
Call<YourResponseModel> yourCallMethod(@Query("yourKey") String yourValue,
                                          @Query("yourKey") String yourValue,
                                          @Query("yourKey") String yourValue);
@POST(“你的字符串”)
调用yourCallMethod(@Query(“yourKey”)字符串yourValue,
@查询(“yourKey”)字符串yourValue,
@查询(“yourKey”)字符串(yourValue);
注意:在这种情况下不要使用“@FormUrlEncoded”


使用Kotlin

对于改装2,您可以使用Gson转换器工厂初始化改装

val builder = GsonBuilder().disableHtmlEscaping().create()
val retrofit = Retrofit.Builder()
        .baseUrl(baseUrl)
        .addConverterFactory(ScalarsConverterFactory.create())
        .addConverterFactory(GsonConverterFactory.create(builder))
        .client(monoOkHttpClient())
        .build()
此生成器应删除json输出中的转义

渐变文件依赖项:

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'

我试图将body作为类发布,但其中的一些变量包含加密字符串,如“66PdGFKsvyyYaVTGJ/nAYQ==”。。。你知道如何防止=符号转换为\u003dinReformation 2吗?我们不能这样使用它。这个答案来自于改型1天,但你不能在改型2这样使用它吗?(我还没有测试):Gson Gson=new GsonBuilder().disableHtmlEscaping().create();改装改装=新建改装.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create(gson)).client(okHttpClient.build();什么是RestAdapter?@MuratÖgatIts不适用于改装2。请建议一些对我不起作用的其他方法。我正在使用“com.squareup.reformation2:reformation:2.3.0”和&“com.squareup.reformation2:converter gson:2.3.0”。请帮忙me@RahulGupta你也需要标量<代码>实现'com.squareup.Refught2:converter scalars:2.1.0'我已将DEP添加到我的答案中。它不支持..请检查..'private static final RestAdapter REST_ADAPTER=new RestAdapter.Builder().setConverter(new GsonConverter(gson))//避免在Request.setEndpoint(API_URL)中发送编码特殊字符。setRequestInterceptor(requestInterceptor).setLogLevel(RestAdapter.LogLevel.FULL).setClient(新的Ok3Client(新的OkHttpClient())).build();'