簡體   English   中英

改造-獲取空錯誤響應正文(MalformedJsonException)

[英]Retrofit - getting null error response body (MalformedJsonException)

我正在嘗試在onFailure(RetrofitError error)獲取錯誤響應主體,但獲取null

我正在使用標頭Accept: text/plain進行請求,並從響應中收到Content-Type: text/plain並且如果設置LogLevel.FULL可以將正文視為文本。 此外, error.getResponse().getStatus()為我提供了正確的狀態代碼。

但是當我執行error.getBody()error.getResponse.getBody()它返回null 內部error我看到successTypejava.lang.String ,所以我認為它應該給我String ,但是error.getCause()顯示給我

com.google.gson.JsonSyntaxException:com.google.gson.stream.MalformedJsonException:使用JsonReader.setLenient(true)在第1行第6列的路徑處接受格式錯誤的JSON $

另外, error.getKind()CONVERSION ,它表示

/ **在反序列化正文時引發了異常。 * /

但我希望能像HTTP

問題是為什么當所有標頭都使用text/plainsuccessTypeString時,為什么嘗試轉換為JSON? 我需要以純文本形式獲得答復。

程式碼片段:

RestAdapter restAdapter = new RestAdapter.Builder()
        .setEndpoint(url)
        .setLogLevel(RestAdapter.LogLevel.FULL)
        .setClient(new CustomOkHttpClient())
        .setRequestInterceptor(new TransactionsRequestInterceptor())
        .build();

TransactionsRestClient httpClient = restAdapter.create(TransactionsRestClient.class);
httpClient.createNewTransaction(request, new retrofit.Callback<String>() {
    @Override
    public void success(String transactionId, Response response) {

    }

    @Override
    public void failure(RetrofitError error) {
        // error.getBody() is null
    }
}
public interface TransactionsRestClient {
    @POST("/transactions")
    void createNewTransaction(@Body TransactionRequest request, Callback<String> transactionId);
}

public class TransactionsRequestInterceptor implements RequestInterceptor {
    @Override
    public void intercept(RequestFacade request) {
        request.addHeader(HOST, host);
        request.addHeader(TOKEN, token);
        request.addHeader(ACCEPT, TEXT);
        request.addHeader(CONTENT_TYPE, JSON);
    }

記錄的請求/響應:

 ---> HTTP POST $url
Host: $host
Accept: text/plain
Content-Type: application/json
Content-Length: 133
$request_body
---> END HTTP (133-byte body)

<--- HTTP 202 $url //202 is expected
Access-Control-Allow-Origin:
Content-Type: text/plain
Date: Wed, 20 May 2015 16:08:46 GMT
Server: spray-can/1.3.1
Content-Length: 50
Connection: keep-alive
OkHttp-Selected-Protocol: http/1.1
OkHttp-Sent-Millis: 1432138139875
OkHttp-Received-Millis: 1432138140004
The record for test10 is not currently authorized. // this is body I have to get
<--- END HTTP (50-byte body)

謝謝。

默認情況下,Retrofit將響應作為JSON讀取並自動解析。 您必須更改其默認行為。

這篇博客文章可能會有所幫助,建議您以以下方式獲得String響應:

new String(((TypedByteArray) response.getBody()).getBytes());

new RestAdapter.Builder()的代碼new RestAdapter.Builder()您沒有指定Converter( setConverter() )。

查看Retrofit代碼,更具體地說,在RestAdapterPlatform上,我檢查了是否未指定Converter它將默認使用GSON:

@Override Converter defaultConverter() {
  return new GsonConverter(new Gson());
}

我相信解決方案是創建一個自定義轉換器(擴展Converter類),並且對您的響應不執行任何操作,僅返回原始String。

是有關如何創建自己的Converter的示例。

暫無
暫無

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

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