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

时间:2015-04-27 20:38:23

标签: rest restful-architecture

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

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

  1. 来自HTTP服务器的CSV文件经常更改,有时甚至是巨大的。
  2. 本地文件。
  3. 当客户端调用服务时,它会执行以下操作:

    1. 它向HTTP服务器发送请求以获取CSV文件。
    2. 获取CSV文件后,它会合并两个来源的数据。
    3. 将结果发送给客户端。结果是一个XML文档。
    4. 问题 有时,在我已经将一些数据返回给客户端之后,HTTP服务器失败,因此我无法继续向客户端发送数据。 发生这种情况时,我想通知客户端有错误。我该怎么做?该服务已经返回了HTTP代码200和一些数据。所以我无法向客户端发送错误500.

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

      服务无法等待发送响应,直到读取来自HTTP服务器的整个文件。原因是有时从HTTP获取的文件非常大并且不适合内存。

      环境:虽然我认为这不重要,但这项服务是在Jersey 1.x中开发的。

2 个答案:

答案 0 :(得分:1)

正如你所说,有几种选择:

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

我建议等到上传完成。

如果文件不适合服务器端内存,那么找一种技术将流写入持久性而不是内存,例如缓存,nosql db或文件系统。这样可以更快地处理文件上传。

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

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

答案 1 :(得分: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文档,它可以使客户端应用程序更好地控制这种情况。