【问题标题】:returning absolute vs relative URIs in REST API在 REST API 中返回绝对与相对 URI
【发布时间】:2012-07-12 16:01:45
【问题描述】:

假设 DogManagementPro 程序是用客户端/服务器架构编写的应用程序,购买它的客户应该在自己的 PC 上运行服务器,并在本地或远程访问它。

假设我想在 DogManagementPro REST API 中支持“列出所有狗”操作。

所以对http://localhost/DogManagerPro/api/dogs 的 GET 现在应该获取以下响应:

<dogs>
  <dog>http://localhost/DogManagerPro/api/dogs/ralf</dog>
  <dog>http://localhost/DogManagerPro/api/dogs/sparky</dog>
</dogs>

我想在我的本地局域网上远程访问它,[我机器的本地 IP 是 192.168.0.33] http://192.168.0.33:1234/DogManagerPro/api/dogs 的 GET 应该获取什么?

应该是:

<dogs>
  <dog>http://localhost/DogManagerPro/api/dogs/ralf</dog>
  <dog>http://localhost/DogManagerPro/api/dogs/sparky</dog>
</dogs>

或许:

<dogs>
  <dog>http://192.168.0.33/DogManagerPro/api/dogs/ralf</dog>
  <dog>http://192.168.0.33/DogManagerPro/api/dogs/sparky</dog>
</dogs>

?

有些人认为我应该通过像这样返回一个路径元素来完全解决这个问题:

<dogs>
  <dog>/DogManagerPro/api/dogs/ralf</dog>
  <dog>/DogManagerPro/api/dogs/sparky</dog>
</dogs>

最好的方法是什么?

【问题讨论】:

  • 还有使用域的选项。然后您将拥有http://dogmanagerpro/api/dogs/sparky 其中dogmanagerpro 将被设置为指向服务器正在侦听的特定机器:端口。此选项在更改物理地址方面最灵活,但它需要您的客户端运行自己的域服务器(DNS 服务器),该服务器可以将 DogManagerPro 映射到绝对地址。

标签: api http rest hyperlink


【解决方案1】:

我个人一直使用非绝对网址。它还解决了一些其他问题,例如反向/缓存代理。

这对客户端来说有点复杂,如果他们想按原样存储文档,这可能意味着他们现在还需要存储基本 url,或者扩展内部 url。

如果您确实选择使用完整 url 路由,我不建议使用 HTTP_HOST,而是设置多个虚拟主机和环境变量并使用它。 如果您以后在源服务器前需要代理,这可以解决问题。

【讨论】:

  • 相对 URL 从服务器端似乎最简单,许多人建议这样做
  • @Aviad 你应该说“许多服务器端的人都建议这样做”。 :) 但这只是故事的一方面。您还需要考虑客户端。见this answer 和this is my understanding too
  • @iceberg 我的意思是相对 URI 和绝对路径
【解决方案2】:

我会说基于客户端发送的 Host 标头创建的绝对 URL

<dogs>
  <dog>http://192.168.0.33:1234/DogManagerPro/api/dogs/ralf</dog>
  <dog>http://192.168.0.33:1234/DogManagerPro/api/dogs/sparky</dog>
</dogs>

返回的 URI 应该是客户端能够解析的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    相关资源
    最近更新 更多