Фон
У меня есть RESTful API, доступ к которому осуществляется через домен http://restapi.com
У меня есть клиентское приложение, использующее 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 идентификатор платежа, который затем можно использовать для создания ссылки на платеж PayPal, например. http://paypal.com?PayId-123456
. Часть процесса создания требует предоставления URL-адресов для перенаправления при отмене или успешном платеже. Опять же, не хочу вдаваться в подробности, но при запросе PayId от PayPal URL-адреса перенаправления отправляются в PayPal как переменные, и я предполагаю, что PayPal хранит их в соответствии с конкретным созданным PayId.
Браузер переходит по ссылке, возвращенной в ресурсе — http://paypal.com?PayId-12345
. Оплата производится, и PayPal затем использует URL-адреса перенаправления по мере необходимости для перенаправления обратно в мое приложение, например. после успешного завершения платежа PayPal должен перенаправить на http://myapp.com/paymentcomplete
. Примечание. Я понимаю, что это не URI с спокойным названием, но это упрощает создание описания моей проблемы.
Проблема
Проблема, которая у меня есть, теперь может быть очевидной. Мне нужно перенаправить обратно на http://myapp.com/paymentcomplete
, НО это API, который предоставляет URL-адрес перенаправления в PayPal. Он ничего не знает о клиентском приложении. Поскольку PayPal является внешней службой, необходимо указать полный URL-адрес. Лучшее, что может сделать API, — отправить http://restapi.com/paymentcomplete
в качестве URL-адреса перенаправления, но если PayPal перенаправит на него, результирующим ответом будет строка JSON (выходной формат моего API), а не красиво отформатированная страница клиентского приложения.
Мой вопрос: как правильно указать URL-адрес перенаправления в PayPal?
Одна из моих мыслей заключалась в том, чтобы заставить клиентское приложение обрабатывать создание PayPal PayId, но мне не нравится этот вариант, так как я хотел бы сохранить создание идентификатора платежа PayPal на стороне API. Также потребуется, чтобы каждое клиентское приложение предоставляло собственную реализацию, чего я тоже не хочу.
Другой вариант, о котором я думал, заключался в том, чтобы попросить клиента указать свой домен в запросе. В настоящее время клиент делает запрос на получение ресурса со ссылкой на PayPal GET http://restapi.com/payment
, но я мог бы использовать POST http://restapi.com/payment
с клиентом, указывающим свой домен в качестве параметра. Затем API может использовать это для создания правильного URL-адреса перенаправления. Мне тоже не очень нравится эта идея, так как она кажется немного хакерской, а также требует, чтобы приложение знало, что оно должно заполнить это поле, то есть пользователь-человек не будет заполнять ввод домена.
Приветствуются дополнительные решения или мысли.