如何将 Retrofit POST 正文作为 JSON 字符串发送?

Posted

技术标签:

【中文标题】如何将 Retrofit POST 正文作为 JSON 字符串发送?【英文标题】:How to send Retrofit POST body as JSON String? 【发布时间】:2020-11-11 14:47:10 【问题描述】:

我有如下服务。我将方法称为Retroifit 库。当我发送带有@Body Test 类型的参数但我想使用@Body String 我不创建Test 类并在@Body 中使用它时,该服务有效。我创建了一个JSONObject 并将其转换为String,但是这样,程序就不起作用了!您能帮我或提出解决方案吗?

我的网络 API:

    [Route("TestService"), HttpPost, IgnoreDataLog]
    public async Task<Result<TestResult>> Add(Test pmDeviceObj)
    
        var listResult = await pmService.AddAsync(pmDeviceObj);
        return listResult;
    

安卓部分:

@POST("TestService")
Call<Result<TestResult>> TestService(@Header("Content-Type") String content_type,@Body String body);

android 中调用服务-> 我使用以下代码得到 StatusCode 400

    JSONObject jsonBody=new JSONObject();
    try 
        jsonBody.put("Id",73);
        jsonBody.put("seri","55656573");
        jsonBody.put("code","fc24009b9160");
        jsonBody.put("sID",8);
    catch (JSONException ex)
        ex.printStackTrace();
    

    retrofit2.Call<Result<TestResult>> call1=service.TestService("application/json",jsonBody.toString());

如果我在 Android 部分使用以下代码,一切正常,我会获取数据。

@POST("TestService")
Call<Result<TestResult>> TestService(@Header("Content-Type") String content_type,@Body Test inputValue);

 Test test=new Test(73,"556565","fc24009b9160",8);
 retrofit2.Call<Result<TestResult>> call1=service.TestService("application/json",test);

【问题讨论】:

查看链接medium.com/@robertas.konarskis/… 【参考方案1】:

发生这种情况是因为 RetrofitString 视为必须转换为 JSON 的“普通”对象,并且不知道它已经是对象的 JSON 表示。

如果您配置了HttpLogginInterceptor,您应该会看到(简化示例)您的 JSON 字符串:

"sId": "8"

其实是这样的:

"\"sId\":\"8\""

为了防止这种情况发生,您需要使用评论中建议的 ScalarsConverterFactory。首先你需要为它设置依赖:

对于 Gradle

dependencies     
    implementation “com.squareup.retrofit2:converter-scalars:2.4.0”

或用于 Maven

<dependency>
    <groupId>com.squareup.retrofit2</groupId>
    <artifactId>converter-scalars</artifactId>
    <version>2.4.0</version>
</dependency>

完成后,您需要将转换器工厂添加到您的改造中,例如(还添加了日志以便于测试):

HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
        .addInterceptor(interceptor).build();
retrofit = new Retrofit.Builder()
        .baseUrl(MY_URL)
        // be sure to add this before gsonconverterfactory!
        .addConverterFactory(ScalarsConverterFactory.create())                
        .addConverterFactory(GsonConverterFactory
                .create())
        .client(client).build();
myApi = retrofit.create(MY_API_CLASS);

【讨论】:

以上是关于如何将 Retrofit POST 正文作为 JSON 字符串发送?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Retrofit 将参数传递给 POST 请求,然后序列化请求?

改造:在 POST @body 中上传图片

retrofit和okhttp请求url的参数拼接

Node.js POST API 和请求正文的解析

如何在 Retrofit 库中将 YAML 响应正文解析为 POJO?

Android Kotlin Retrofit Post Request 输入的数据未发送