当前位置: 首页 > 知识库问答 >
问题:

改装-获取空错误响应正文(MalformedJsonException)

谯嘉懿
2023-03-14

我试图在onFailure(ReformationError error)中获取错误响应正文,但获取的是null。

我正在使用标题“Accept:text/plain”(接受:text/plain)(接收请求)和“response”(响应),如果我设置日志级别,则可以将正文视为文本。完整。此外,<代码>错误。getResponse()。getStatus()为我提供正确的状态代码。

但是当我执行error.getbody()error.getResponse.getbody()时,它返回null。在error中,我看到成功类型java.lang.String,所以我假设它应该给我String,但是error.get原因()显示了我

com.google.gson.JsonSyntaException:com.google.gson.stream.MalformedJsonException:使用JsonReader.setLenient(true)在第1行第6列路径$接受格式错误的JSON

此外,<代码>错误。getKind()是转换,代表

/**对正文进行(反)序列化时引发异常*/

但我希望得到的是HTTP

问题是,当所有标题都使用文本/纯文本,并且成功类型是字符串时,为什么它会尝试转换为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个答案

勾炳
2023-03-14

在您的代码中new RestAdapter. Builder()您没有指定Converter(setConverter())。

查看Retrofit代码,更具体地说,在RestAdapter和Platform中,我检查了如果您不指定转换器,它将默认使用GSON:

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

我认为解决方案是创建一个自定义转换器(扩展转换器类),而不对响应执行任何操作,只返回原始字符串。

下面是一个如何创建自己的转换器的示例。

党浩阔
2023-03-14

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

这篇博文可能会有所帮助,并建议您将String响应设置为:

new String(((TypedByteArray) response.getBody()).getBytes());
 类似资料:
  • 我正在测试改进,以与凌空比较,我很难得到我的请求的回应。例如,我做这样的事情: 它工作了,对象< code>toto被设置,但是出于测试目的,我还想显示服务器返回的JSON响应。 所以我正试图从读取,这是一个。不幸的是,我总是得到一个了。 我尝试使用Retrofit中的Utils类,但我得到了相同的错误。

  • 问题内容: jQuery的AJAX错误函数具有以下参数: 跨浏览器获取响应主体的最佳方法是什么? 这行得通吗(可靠地在所有浏览器中)? 问题答案: 有一个隐藏的函数可以从XHR等距提取数据: 如果您将其作为第二个参数传递,它将把响应视为JSON字符串。 请注意,由于没有响应(例如网络问题),您可能会收到错误消息。确保您也涵盖了这种情况。另外,我相信(不确定)如果服务器返回或状态,则jQuery会调

  • 虽然,如果我将链接插入浏览器,我将得到json格式。 这就是请求的工作结果 `

  • 问题内容: 在Java中,当HTTP结果为404范围时,此代码将引发异常: 就我而言,我碰巧知道内容是404,但无论如何我还是想阅读响应的内容。 (在我的实际情况下,响应代码为403,但是响应的主体说明了拒绝的原因,我希望向用户显示该原因。) 如何访问响应正文? 问题答案: 这是错误报告(关闭,无法修复,不是错误)。 他们的建议是这样编码:

  • 这是我的服务器响应; 我的服务器响应在这里,它返回一些参数和一些常量的Json数组格式的值…

  • 问题内容: 我正在向我的jQuery发送错误响应。但是,我无法获得响应文本(在下面的示例中,这将成为 “去海滩” ) jQuery唯一说的是“错误”。 有关详细信息,请参见以下示例: 的PHP jQuery的 现在我的结果是: 日志: 警报: 无法执行,因为:错误 有任何想法吗? 问题答案: 尝试: