我有一个RESTful Web服务,它使用 User 域对象的编组XML表示(使用JAXB)响应/ user / {userId}。什么是向客户回馈有关其请求的其他详细信息的适当方式,特别是如果它不返回他们期望的信息?在非分布式Java应用程序中,您可能有一个处理数据访问或安全异常的catch块。如果/ user / {userId}没有返回任何内容(例如,Web服务持久性机制不起作用,存在安全限制等等),我如何在对客户端的响应中包含有意义的信息?
我不认为DTO是我需要的,因为我不是在寻找域对象的不同表示。相反,我正在寻找有关请求期间发生的事情的信息,这可能会阻止它返回客户期望的信息。将域对象包含在某种包含相关元数据的ResponseObject中是否合适?这种方法的缺点是我宁愿不让我的服务层接口都将ResponseObject作为它们的返回类型,因为我很可能提供一个不具有相同元数据要求的非RESTful实现。
答案 0 :(得分:3)
与客户沟通有关其请求的其他详细信息的适当方式是什么,特别是如果它不返回他们期望的信息。
如果/ user / {userId}没有返回任何内容(例如,Web服务持久性机制不起作用,存在安全限制等等),我如何在响应中包含有意义的信息对客户?
这是REST状态代码在RESTful服务中的用途。
要表明请求的userId
与实际用户不对应,您可以返回404 Not Found
。
要指示应用程序中的内部错误(例如无法连接到数据库),您可以返回500 Internal Server Error
。
您正在描述的选项 - 将您的回报包装在ResponseObject
中,然后包含真正的“响应状态” - 听起来非常像SOAP。
REST的优点,或者至少是人们声称的,是您可以使用现有的HTTP响应状态代码来模拟实际响应的几乎所有状态。
答案 1 :(得分:1)
如果确实是错误情况(安全问题,没有数据库连接,甚至没有找到提供的ID的用户),那么只需抛出异常。客户端收到故障并可以根据其中包含的信息行事。
您使用哪种实施方案?例如,在Apache CXF中,您可以自己定义异常处理程序并为异常呈现XML,并且您可以自由地包含您喜欢的任何元信息。
答案 2 :(得分:1)
我会使用异常捕获信息,然后使用适当的状态代码将这些异常映射到HTTP响应。如果您正在使用JAX-RS,则可以通过创建ExceptionMapper
的实现来实现此目的,或者如果您使用的是Restlet,则可以创建StatusService
的子实现。
http://wikis.sun.com/display/Jersey/Overview+of+JAX-RS+1.0+Features http://wiki.restlet.org/docs_2.0/13-restlet/27-restlet/331-restlet/202-restlet.html