簡體   English   中英

如何將 Retrofit POST 正文作為 JSON 字符串發送?

[英]How to send Retrofit POST body as JSON String?

我有如下服務。 我將方法Retroifit庫。 當我發送帶有@Body Test類型的參數時,該服務有效,但我想使用@Body String我不創建Test class 並在@Body中使用它。 我創建了一個JSONObject並將其轉換為String但是這樣,程序不起作用? 你能幫我或建議一個解決方案嗎?

我的 Web API:

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

Android 部分:

@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);

This happens because Retrofit considers String as a 'normal' object that has to be converted to a JSON and is not aware that it already is a JSON represntation of object.

如果您配置了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>

完成后,您需要將轉換器工廠添加到您的 Retrofit 中,例如(還添加了日志以便於測試):

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM