Java 如何标记REST中的资源需要更多信息

Java 如何标记REST中的资源需要更多信息,java,rest,Java,Rest,在创建用户时,我们发送用户信息,在数据库中创建用户(因此现在用户具有uniqe id)并执行信用检查 如果a)用户的信用评分高于某个数字,则一切正常(201)。 b) 如果没有,我们需要用户提供更多信息 对付b的平静方式是什么 谢谢您仍然应该返回OK/HTTP状态200或Created/201。据我所知,你的问题,你的新用户将创建无论如何,只是随后的信用检查可能会失败。但是服务器端和客户端工作正常。这是唯一重要的事情。只有当客户端出现问题时,才能使用4xx,例如,用户在数字字段中使用了字符串。您

在创建用户时,我们发送用户信息,在数据库中创建用户(因此现在用户具有uniqe id)并执行信用检查

如果a)用户的信用评分高于某个数字,则一切正常(201)。 b) 如果没有,我们需要用户提供更多信息

对付b的平静方式是什么


谢谢

您仍然应该返回OK/HTTP状态200或Created/201。据我所知,你的问题,你的新用户将创建无论如何,只是随后的信用检查可能会失败。但是服务器端和客户端工作正常。这是唯一重要的事情。只有当客户端出现问题时,才能使用4xx,例如,用户在数字字段中使用了字符串。您不能使用5xx,因为服务器端没有任何问题,例如您的信用服务出现异常。您的信用服务失败的实际信息以及需要用户提供的更多信息应包含在HTTP响应正文中。

您仍应返回OK/HTTP状态200或Created/201。据我所知,你的问题,你的新用户将创建无论如何,只是随后的信用检查可能会失败。但是服务器端和客户端工作正常。这是唯一重要的事情。只有当客户端出现问题时,才能使用4xx,例如,用户在数字字段中使用了字符串。您不能使用5xx,因为服务器端没有任何问题,例如您的信用服务出现异常。您的信用服务失败的实际信息以及需要用户提供的更多信息应包含在HTTP响应的正文中。

在其当前形式中,信用检查听起来更像是RPC操作,而不是RESTful资源。尽管信用检查可能会调用某家银行的REST API,该API返回
信用值
,或者不是查询的结果,但将检查包括在用户创建过程(IMO)中并不十分RESTful

因此,b)不是真正的RESTful,因为它不处理资源,而是执行类似RPC的操作(信用检查)

这里基本上有两个选项:

  • 将整个过程定义为原子过程,并将信用属性声明为强制属性,并且仅当用户的付款/信用/。。。选项可用并已进行肯定检查(如果缺少某些内容或检查失败,则返回400)
  • 从信用检查中拆分用户创建
对于后者,您应该将信用检查与用户创建分开。成功创建用户后,返回201(与您一样),其中包含客户端可用于执行下一个任务(HATEOAS)的其他链接

由于信用检查本身并不是RESTful服务的真正候选对象,因为它本身不是一个资源,而是一个类似RPC的操作(如已注释的),因此您可能希望将此代码重构为一个可能是Spring管理的服务bean,并将其注入到这些需要有信用的用户的资源处理程序中

此外,您还可以提供资产负债表(
/api/users/1234/balance
),用户可以在该表中查找其当前余额,并获得用户可用于进一步操作的操作(以链接的形式)(如向其余额中添加更多资金等)


如果一个用户试图访问
/api/article/yxz
,而这篇文章要求用户有一个正余额,如果用户没有足够的钱,你可以返回一个
402所需的付款

在其当前形式中,信用检查听起来更像是一个RPC操作,而不是一个RESTful资源。尽管信用检查可能会调用某家银行的REST API,该API返回
信用值
,或者不是查询的结果,但将检查包括在用户创建过程(IMO)中并不十分RESTful

因此,b)不是真正的RESTful,因为它不处理资源,而是执行类似RPC的操作(信用检查)

这里基本上有两个选项:

  • 将整个过程定义为原子过程,并将信用属性声明为强制属性,并且仅当用户的付款/信用/。。。选项可用并已进行肯定检查(如果缺少某些内容或检查失败,则返回400)
  • 从信用检查中拆分用户创建
对于后者,您应该将信用检查与用户创建分开。成功创建用户后,返回201(与您一样),其中包含客户端可用于执行下一个任务(HATEOAS)的其他链接

由于信用检查本身并不是RESTful服务的真正候选对象,因为它本身不是一个资源,而是一个类似RPC的操作(如已注释的),因此您可能希望将此代码重构为一个可能是Spring管理的服务bean,并将其注入到这些需要有信用的用户的资源处理程序中

此外,您还可以提供资产负债表(
/api/users/1234/balance
),用户可以在该表中查找其当前余额,并获得用户可用于进一步操作的操作(以链接的形式)(如向其余额中添加更多资金等)


如果f.e.用户试图访问
/api/article/yxz
,而这篇文章要求用户有正余额,您可以返回
402所需付款
,以防用户剩下的钱不够。

我想我写自己的答案太快了。当然,如果操作(部分)成功,则不应使用
400
。我删除了我的答案,取而代之的是你的答案。HTTP状态代码的粒度不足以映射到更具体的错误消息。正如我所建议的,你应该把它放在HTTP响应的主体中,例如,放在一个包含额外错误代码或错误消息的JSON对象中。当然,不应该使用
400