【发布时间】:2015-05-21 01:10:41
【问题描述】:
我试图在onFailure(RetrofitError error) 中获取错误响应正文,但得到null。
我将标题 Accept: text/plain 用于请求,并从响应中收到 Content-Type: text/plain,如果我设置 LogLevel.FULL,则可以将正文视为文本。此外,error.getResponse().getStatus() 给了我正确的状态码。
但是当我执行error.getBody() 或error.getResponse.getBody() 时,它会返回null。在error 内部,我看到successType 是java.lang.String,所以我认为它应该给我String,但error.getCause() 显示给我
com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException:使用 JsonReader.setLenient(true) 在第 1 行列接受格式错误的 JSON 6 路径 $
另外,error.getKind() 是 CONVERSION,代表
/** 在(反)序列化主体时引发异常。 */
但我希望得到像HTTP这样的善意
问题是为什么当所有标头都使用text/plain 而successType 是String 时它会尝试转换为JSON?
我需要以纯文本形式获得回复。
代码sn-p:
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 是 REST client 并且期望响应是 JSON 而不是纯文本。您的回复似乎已返回为
null这不是 JSON -
REST 也支持纯文本,而不仅仅是 json。在对改造请求/响应进行全级别日志记录时可以看到响应并在此处显示为文本,但无法访问
-
请张贴您用于提出请求的相关代码
-
您应该发布您的 Android 代码,这是您的问题(和解决方案)的根源。请不要在外部资源中发布代码,因为它们可能会过期