REST API:当服务已经返回200和一些数据时,如何通知客户端请求失败?
我在做什么?我正在开发一种REST Web服务,该服务从两个来源返回数据:
[当客户端调用服务时,它执行此操作:
问题有时,在我已经向客户端返回了一些数据之后,HTTP服务器发生故障,因此我无法继续向客户端发送数据。发生这种情况时,我想通知客户端有错误。我应该怎么做?该服务已返回HTTP代码200和一些数据。因此我无法向客户端发送错误500。
我是否应该简单地将错误消息写入输出?客户端将失败,因为它的XML文档将无效。
服务无法等待发送响应,直到从HTTP服务器读取了整个文件。原因是有时从HTTP获取的文件很大,无法容纳在内存中。
Environment:尽管我认为这并不重要,但是此服务是在Jersey 1.x中开发的。
正如您所说的,有两种选择:
我建议您等待上传完成。
如果文件不能容纳在服务器端内存中,请找到一种将流写入持久性而不是内存中的技术,例如缓存,nosql db或文件系统。这样可以更快地处理文件上传。
如果上传后需要更多时间在服务器端处理文件,则可以返回202接受状态,其中Location:标头具有长期运行的资源。客户可以继续检查作业是否完成。这样可以避免必须一次HTTP往返处理整个事件。
一些使用RESTful长操作的好例子:
回复我自己。这可能对其他人有用。
最初,我开发了此选项:如果在已经发送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文档,它可以使客户端应用程序更好地控制这种情况。