REST:如何 return 返回下一个动作 url 作为响应 body?

REST: How to return back the next action url in response body?

我们创建了一个 API 来获取用户详细信息。要获取任何特定用户的详细信息,需要输入经过验证的号码。

API 看起来像:

GET /api/details/?number=983984348&userid=123

这里的 userid 是我们需要的详细信息的用户 ID,编号是 mobile-number 想要获取这些详细信息的人。如果该号码得到验证,我们将返回 user 123 的详细信息。如果号码未通过验证,我们会将状态发回为未验证。

如果客户端返回未验证状态,客户端需要点击验证API。 API 看起来像:

/api/verify/?number=983984348

一旦这个API被命中,客户端得到URL需要被命中来验证。

目前,我们在每个客户端都有 hard-coded 这个 API url /api/verify/?number=983984348 但是根据 HATEOAS 这是不正确的,因为它建议应该被引导按服务器。

我不知道这个 API url 应该如何从客户端发送到服务器,即使用简单响应 body 或响应 headers?有人可以解释一下如何将这种导航从服务器引导到客户端吗?

想想你的问题的范围,如果你点击了 /api/details/?number=983984348&userid=123 uri,它告诉客户这个号码没有被验证,那么你也可以在 body 中包含响应要使用的 URI。

示例(使用 HAL,编码为 JS 而不是 JSON,但同样适用于其他超媒体格式):

{
  _links : {
    self : { href: '/api/details/?number=983984348&userid=123' },
    verify : { href: '/api/verify/?number=983984348' }
  }
  verified: false
}

HTTP Link header 也可以工作:

Link: </api/verify/?number=983984348>; rel="verify"

在我们的例子中,我们构建了一个 open-source javascript REST 客户端,它支持 header 或 hal _link,并且不关心它是哪一个。我们的客户会做这样的事情:

var client;
// usually you'll want to discover this url as well.
var user = await client.getResource('/api/verify/?number=983984348');
var userBody = await client.get();

if (!userBody.verified) {
  var verifyResource = await userBody.follow('verify');
  // verifyResource.put() might come next?
}

不确定最后一点是否有帮助,但它帮助我思考了这个问题。