为什么Retrofit2会在我的POST主体中添加引号?

时间:2016-09-13 20:31:59

标签: java retrofit2

我有一个API请求,其中POST正文是以纯文本形式传输的十六进制编码二进制数据。由于我无法辨别的原因,Retrofit2在将十六进制编码的字符串添加到请求之前添加引号,这会导致服务器阻塞它并抱怨格式错误的请求。

我们正在将我们的应用程序从原始的Retrofit转换为Retrofit2,并且根本没有任何有效负载生成代码发生了变化。

我已经能够通过在运行时使用Interceptor从请求正文中删除封闭引号来解决此问题,但这似乎是一个非常愚蠢的箍,必须跳过我和我#39; d而不是首先出现引号。

我的界面如下所示:

public interface SampleApi {
    @POST("sample-endpoint")
    Call<ApiResponse> postThing(@Body String hexEncodedData,
                                @Header(HttpHeaders.DATE) String gmtDateStr,
                                @Header("X-CUSTOM-ONE") long custom1,
                                @Header("X-CUSTOM-TWO") String custom2);
}

我已尝试将Content-Type标头设置为各种值,但没有明显效果。我还没有构建一个自定义类型的转换器,因为必须为普通的旧字符串制作其中一个转换器似乎不应该是必要的。

有人能告诉我我做错了吗?

2 个答案:

答案 0 :(得分:9)

双引号是合乎逻辑的,因为改装是以json格式发送数据所以如果键入String则双引号。试试这可能会对你有所帮助。

public interface SampleApi {
    @POST("sample-endpoint")
    Call<ApiResponse> postThing(@Body RequestBody hexEncodedData,
                                @Header(HttpHeaders.DATE) String gmtDateStr,
                                @Header("X-CUSTOM-ONE") long custom1,
                                @Header("X-CUSTOM-TWO") String custom2);
}


String strRequestBody = "body";
RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain"),strRequestBody);

答案 1 :(得分:0)

更新,对于 Kotlin,Code_Life 代码应如下所示:

interface SampleApi {
  @POST("sample-endpoint")
   suspend fun postThing(
      @Body presentation: RequestBody,
      @Header(HttpHeaders.DATE) gmtDateStr: String,
      @Header("X-CUSTOM-ONE") custom1: Long,
      @Header("X-CUSTOM-TWO") custom2: String
   ): Call<ApiResponse>
}
    
    val strRequestBody = "body"
    val requestBody = strRequestBody.toRequestBody("text/plain".toMediaTypeOrNull()