【问题标题】:REST API: Providing redirect URIs to external services using client app domainREST API:使用客户端应用程序域向外部服务提供重定向 URI
【发布时间】:2014-03-14 09:57:03
【问题描述】:

背景

我有一个通过域http://restapi.com 访问的 RESTful API

我有一个使用 http://restapi.com 的客户端应用程序。客户端应用具有域http://myapp.com

我的 HATEOAS 设置方式是 API 呈现没有域的 URI。因此,它不是http://restapi.com/some/resource,而是包含指向资源的链接,例如/some/resource。示例 API json 资源如下:

{"_links":{"self":{"href":"/some/resource"}}}

这样做的好处是 API 不需要了解客户端应用程序,客户端应用程序只需做很少的事情即可从 API 获取正确的资源,并且不必重新格式化所有 URI资源。例如,在客户端应用程序中,浏览器将使用以下 URI http://myapp.com/some/resource。当应用程序收到请求时,它需要调用 API 来获取资源并简单地交换域,即http://restapi.com/some/resource

这是成功的,并且允许很大的灵活性让不同的客户端使用 API,而唯一需要的知识是 API 的初始端点(域)。它还将 API 与客户端应用程序完全分离。

我遇到的问题是我已经开始使用一些外部服务(特别是 PayPal 自适应支付),我需要为取消支付和成功支付提供重定向 URL。例如,浏览器导航到http://myapp.com/paymenthttp://restapi.com/payment 返回的资源提供了指向 PayPal 的链接。无需过多详细说明,API 必须向 PayPal 询问付款 ID,然后可以使用该 ID 创建指向 PayPal 付款的链接,例如http://paypal.com?PayId-123456。创建过程的一部分要求提供 URL 以在付款取消或成功时重定向。同样,不想详细说明,但是当从 PayPal 请求 PayId 时,重定向 URL 作为变量发送到 PayPal,我猜 PayPal 将它们存储在创建的特定 PayId 中。

浏览器导航到资源中返回的链接 - http://paypal.com?PayId-12345。付款完成后,PayPal 会根据需要使用重定向 URL 重定向回我的应用,例如成功完成付款后,PayPal 应重定向至http://myapp.com/paymentcomplete。注意:我意识到这不是一个完全命名的 URI,但它简化了对我的问题的描述

问题

我现在的问题可能很明显。我需要重定向回http://myapp.com/paymentcomplete但是它是提供重定向 URL 到 PayPal 的 API。它不了解客户端应用程序。由于 PayPal 是一项外部服务,因此必须提供完整的 URL。 API 可以做的最好的事情是发送http://restapi.com/paymentcomplete 作为重定向 URL,但如果 PayPal 重定向到此,结果响应将是 JSON 字符串(我的 API 的输出格式),而不是客户端应用程序的格式良好的页面。

我的问题是,正确向 PayPal 提供重定向 URL 的好方法是什么?

我的一个想法是让客户端应用程序处理创建 PayPal PayId,但我不喜欢这个选项,因为我想在 API 端创建 PayPal 支付 ID。它还要求每个客户端应用程序都提供自己的实现,这也是我不想要的。

我想到的另一个选择是要求客户端在请求中提供其域。目前,客户端通过链接到 PayPal 获取资源的请求是GET http://restapi.com/payment,但我可以使用POST http://restapi.com/payment,客户端提供其域作为参数。然后 API 可以使用它来构造正确的重定向 URL。我也不太喜欢这个想法,因为它看起来有点骇人听闻,并且还要求应用知道必须填写此字段,即人类用户不会填写域输入。

非常欢迎其他解决方案或想法。

【问题讨论】:

    标签: rest restful-url restful-architecture


    【解决方案1】:

    正如您已经提到的,PayPal 是一个需要此附加参数的外部 API,您无法控制它。看起来客户端是唯一可以提供重定向 URI 信息的一方。

    想到了几个想法。

    1. 客户端可以通过标头将重定向 uri 发送到restapi,因此 保持您的休息网址完好无损。这是一个灰色地带,不违反restful api 在我看来。 (话又说回来,这只是我的意见)。

    2. restapi 可以返回带有占位符的响应 客户端在渲染前填写。这样API不需要知道 关于重定向uri,责任留给客户 其中有这些信息。

    如果您可以通过在浏览器上执行几行 Javascript 代码来填充占位符来实现选项 2,那就更好了。这很容易。最终,只有此交易的 2 个端点会知道重定向 uri - 浏览器和贝宝。

    这可以减轻您的大部分顾虑。处理 PayPal id 的工作将继续由您的 API 完成。

    【讨论】:

      【解决方案2】:

      您应该能够使用 Referer 标头来确定客户端的完整 URI。它可能会自动为您填充。如果没有,您可以自己添加。 URI 类具有为您拉出客户端主机的方法。当 API 构建 PayPal URI 以返回给客户端时,它可以包含客户端的主机。

      请注意,referer 并不总是包含在内,有时会被中介剥离,如 wiki 页面上所述。由于在这种情况下您同时控制客户端和服务器,因此您应该能够告诉每个人都玩得很好。

      【讨论】:

        【解决方案3】:

        我会保留GET http://restapi.com/payment 并通过客户端域传入查询参数

        GET http://restapi.com/payment?domain=http://myapp.com (of course, the "http://myapp.com" needs to be encoded)
        

        【讨论】:

        • 使用 GET 而不是 POST 更好,因为您正在请求资源。此外,对于您当前的问题,这是最简单的解决方案,无需对您的 REST API 设计进行重大更改。
        • 但这要求客户端应用了解 URI 结构并知道它需要将其域附加到请求中 - 似乎有点不安。
        猜你喜欢
        • 1970-01-01
        • 2014-08-02
        • 2012-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-01
        相关资源
        最近更新 更多