REST API:当服务已经返回200以及某些数据时,如何通知客户端请求失败了?
我在做什么? 我正在开发一个REST Web服务,它从两个来源返回数据:
当客户端调用服务时,它会执行以下操作:
问题 有时,在我已经将一些数据返回给客户端之后,HTTP服务器失败,因此我无法继续向客户端发送数据。 发生这种情况时,我想通知客户端有错误。我该怎么做?该服务已经返回了HTTP代码200和一些数据。所以我无法向客户端发送错误500.
我应该简单地向输出写入错误消息吗?客户端将失败,因为XML文档无效。
服务无法等待发送响应,直到读取来自HTTP服务器的整个文件。原因是有时从HTTP获取的文件非常大并且不适合内存。
环境:虽然我认为这不重要,但这项服务是在Jersey 1.x中开发的。
答案 0 :(得分:1)
正如你所说,有几种选择:
我建议等到上传完成。
如果文件不适合服务器端内存,那么找一种技术将流写入持久性而不是内存,例如缓存,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文档,它可以使客户端应用程序更好地控制这种情况。