REST API:当服务已返回200和一些数据时,如何通知客户端请求已失败?

问题描述 投票:1回答:2

REST API:当服务已经返回200和一些数据时,如何通知客户端请求失败?

我在做什么?我正在开发一种REST Web服务,该服务从两个来源返回数据:

  1. 来自HTTP服务器的CSV文件,该文件经常更改,有时会很大。
  2. 本地文件。

[当客户端调用服务时,它执行此操作:

  1. 它向HTTP服务器发送请求以获取CSV文件。
  2. 获得CSV文件后,它将两个来源的数据合并。
  3. 将结果发送给客户端。结果是一个XML文档。

问题有时,在我已经向客户端返回了一些数据之后,HTTP服务器发生故障,因此我无法继续向客户端发送数据。发生这种情况时,我想通知客户端有错误。我应该怎么做?该服务已返回HTTP代码200和一些数据。因此我无法向客户端发送错误500。

我是否应该简单地将错误消息写入输出?客户端将失败,因为它的XML文档将无效。

服务无法等待发送响应,直到从HTTP服务器读取了整个文件。原因是有时从HTTP获取的文件很大,无法容纳在内存中。

Environment:尽管我认为这并不重要,但是此服务是在Jersey 1.x中开发的。

rest restful-architecture
2个回答
1
投票

正如您所说的,有两种选择:

  • 在您的上传请求完成之前,开始发送响应200 OK,但是要依靠客户端来检测无效的即时响应;或
  • 等待,直到请求文件上传完成,然后再发送HTTP响应。然后,您可以发送正确的状态代码(2xx或500)。

我建议您等待上传完成。

如果文件不能容纳在服务器端内存中,请找到一种将流写入持久性而不是内存中的技术,例如缓存,nosql db或文件系统。这样可以更快地处理文件上传。

如果上传后需要更多时间在服务器端处理文件,则可以返回202接受状态,其中Location:标头具有长期运行的资源。客户可以继续检查作业是否完成。这样可以避免必须一次HTTP往返处理整个事件。

一些使用RESTful长操作的好例子:


0
投票

回复我自己。这可能对其他人有用。

最初,我开发了此选项:如果在已经发送HTTP代码200时生成服务输出时出错,则该服务会将错误消息写入输出并关闭连接。在这些情况下,响应的XML无效。

稍后,我不得不更改此行为,因为用户抱怨在这种情况下,响应是无效的XML。结果,他们所看到的只是他们的应用程序的XML解析器返回的错误,指出XML无效,而不是实际的错误消息。

为避免此问题,我更改了服务的行为:

没有错误时,响应如下所示:

<view name="demo_stats">
    <demo_stats>
        <int_type>1</int_type>
        <numeric_type>1.1</numeric_type>
    </demo_stats>
    <demo_stats>
        <int_type>2</int_type>
        <numeric_type>2.2</numeric_type>
    </demo_stats>
</view>

如果生成服务的输出时出错,并且该服务已经发送了HTTP代码200,则响应如下所示:

<view name="demo_stats">
    <demo_stats>
        <int_type>1</int_type>
        <numeric_type>1.1</numeric_type>
    </demo_stats>
    <demo_stats>
        <int_type>2</int_type>
        <numeric_type>2.2</numeric_type>
    </demo_stats>
    <errors>
        <error>There was an error transforming the value of row #3</error>
    </errors>
</view>

元素errors是可选的,仅在生成输出期间发生错误时才显示。这是一个有效的XML文档,它可以使客户端应用程序更好地控制这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.