REST:如何在响应正文中返回下一个操作URL?

时间:2017-08-31 18:28:25

标签: rest api restful-architecture hateoas

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

API看起来像:

    var callbacks = MTAudioProcessingTapCallbacks(
        version: kMTAudioProcessingTapCallbacksVersion_0,
        clientInfo: UnsafeMutableRawPointer(Unmanaged<AnyObject>.passUnretained(self as AnyObject).toOpaque()),
        init: tapInit,
        finalize: tapFinalize,
        prepare: tapPrepare,
        unprepare: tapUnprepare,
        process: tapProcess)

    var tap: Unmanaged<MTAudioProcessingTap>?
    let status = MTAudioProcessingTapCreate(kCFAllocatorDefault, &callbacks, kMTAudioProcessingTapCreationFlag_PostEffects, &tap)
    if status != noErr {
        debugPrint("Failed to create audio processing tap.")
        throw BoosterExporterError.failure
    }

此处,userid是我们需要的详细用户的ID,并且该号码是移动设备 - 想要获取这些详细信息的人数。如果验证了该号码,我们会收到GET /api/details/?number=983984348&userid=123 的详细信息。如果未验证该号码,我们会将状态发回“未验证”。

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

user 123

点击此API后,客户端会获取需要点击以验证的网址。

目前,我们已按照/api/verify/?number=983984348 错误对每个客户端的{url /api/verify/?number=983984348进行了硬编码,因为它建议应由服务器指导。

我不知道这个API网址应该如何从客户端发送到服务器,即在响应头中使用简单的响应体OR?有人可以解释一下如何将这种导航从服务器引导到客户端吗?

1 个答案:

答案 0 :(得分:1)

只考虑问题的范围,如果你点击/api/details/?number=983984348&userid=123 uri,它告诉客户端该号码未经验证,那么你也可以在响应的正文中包含一个URI使用

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

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

HTTP链接头也可以工作:

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

在我们的例子中,我们构建了一个开源的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?
}

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