改造 - 获取null错误响应主体(MalformedJsonException)

时间:2015-05-20 16:25:04

标签: android retrofit

我正在尝试在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行的格式错误的JSON   6路$

此外,error.getKind()CONVERSION,代表

  

/ **在(de)序列化主体时抛出异常。 * /

但我希望得到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)

感谢。

2 个答案:

答案 0 :(得分:1)

默认情况下,Retrofit将响应作为JSON读取并自动解析。你必须改变它的默认行为。

This blog post可能会有所帮助,建议您将String响应作为:

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

答案 1 :(得分:1)

在您的代码new RestAdapter.Builder()中,您未指定转换器(setConverter())。

查看Retrofit代码,更具体地说是RestAdapterPlatform我检查过如果你没有指定转换器,它将使用GSON作为默认值:

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

我相信解决方案是创建一个自定义转换器(扩展转换器类)并且不对您的响应做任何事情,只返回原始字符串。

Here是一个关于如何创建自己的转换器的示例。