【发布时间】: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/payment。 http://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