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

修改:请求失败时获取原始响应体

东门清夷
2023-03-14

我正在使用带有Robospice(1.4.14)的Revovit(1.6.1)从一些服务中获取数据(响应应该在JSON中)。

在某些情况下,我可能会收到一个HTML错误页面,而不是一个JSON响应。服务器返回一个200状态代码,我不能改变它。在这种情况下,RoboSpice将调用OnRequestFailure(SpiceException)方法。

在那里,我可以获得原始的retrofiterrorexpetion,但正文是null。我是这样得到的:

if (spiceException.getCause() instanceof RetrofitError) {
    RetrofitError error = (RetrofitError) spiceException.getCause();
    error.getBody(); // returns null
}

在研究了reverfit的源代码之后,我发现如果转换失败(这里就是这种情况,因为reverfit期望JSON并接收HTML),那么主体将被替换为null

RestAdapter中的以下一行是我的问题的来源:

response = Utils.replaceResponseBody(response, null);

有没有办法不将正文设置为null?在另一个SO问题中,我发现如果服务器返回4xx,主体将被保留,但我不能改变这一点。

共有1个答案

师谦
2023-03-14

您可能应该创建一个改进型方法,该方法将只返回reverfit.client.response,如果响应主体的格式是必需的,则手动调用转换。

您的改装界面:

...
@GET("/foo/bar")
Response fooBarMethod(Object foo, Object bar);
...

您的RoboSpice请求:

...
@Override
public final FooBar loadDataFromNetwork() throws Exception {
    Response r = getService().fooBarMethod(foo, bar);
    if (isBodyInHtmlFormat()) {
        // cool stuff
        throw new ResponseIsHtmlException();
    } else {
        // it is wise to make sure that it is 
        // exactly the same converter you are passing to
        // your RetrofitSpiceService
        Converter converter = createGsonConverter();
        return (FooBar) converter.fromBody(response.getBody(), FooBar.class);
    }
}
 类似资料:
  • 我是iOS和Swift的新手,我正在尝试使用AlamoFire3.4.0来做一个web请求。当我的请求成功时,一切都很好。但是,如果我的请求失败,服务器将返回300或更大的状态代码,以及响应体中的一些JSON,其中包含关于请求失败原因的更多信息。例如,我正在与之交谈的API要求对每个请求进行身份验证。如果身份验证由于某种原因失败,我将返回401,响应体中的JSON将为: 我发出此请求的代码如下所示

  • 我在Alamofire 5.3中收到了大量失败的请求,其中响应对象本身为nil,或者错误为“无法解析响应”。我可以从服务器日志中看到,所有这些请求都返回有效。 这是我的设置: API管理器类: AccessTokenInterceptor: 这个拦截器从插入我的授权令牌 我也使用标准路由器的URL刚需转换,编码是通过JSON序列化(字典)或可编码协议(对象) 奇怪的是,我不认为我在做任何不同于我使

  • 我正试图通过改型2获得原始响应。0.2. 到目前为止,我试图使用以下代码行打印响应,但它打印的是地址,而不是确切的响应正文。 日志i(“原始消息”,response.body()。toString());

  • 问题内容: 尝试在Python中获取HTTP响应内容的原始数据。我有兴趣通过另一个渠道转发响应,这意味着理想情况下,内容应尽可能原始。 什么是做到这一点的好方法? 问题答案: 如果使用呼叫获取HTTP响应,则可以使用响应的属性。这是docs中的代码。

  • 问题内容: 有什么方法可以获取原始响应的HTTP标头? 该方法对我不起作用,因为服务器吐出了多个“ Set-Cookie”,其中一些丢失了。 问题答案: 该方法对我不起作用 您是在的情况下问这个的吗?不可以,无法使用原始HTTP响应标头。您需要退回到低级的Socket编程。这是一个SSCCE,只需复制“ 粘贴 ”即可运行它。 为了避免每个尝试此代码片段的人都使SO过载,输出如下所示: 要了解有关以

  • 我使用拦截器设置请求的头,如下所示: 并且一切按预期工作(服务器看到并接受)。 我的问题是,当响应到来时,我想在我的应用程序中读取这些标题。 我使用,但总是返回一个空的String[]。所有其他属性(url、params、verb)都可以访问,只有标头丢失了。 我在请求头中设置了一个键,基本上我想在收到响应时检查这个键。 有没有线索为什么标头不可见以及如何在中获取它们?