php 如何在Web应用程序URL结构中组织资源

mwngjboj  于 2023-05-27  发布在  PHP
关注(0)|答案(2)|浏览(68)

当前情况

我正在用PHP开发一个在线订单管理系统应用,需要通过URL方案设计REST资源Map。
我有典型的资源:

*客户(有订单)
*订单(有票)
*工单(有消息)
*留言内容

我在想这样的事情:
1.客户简介:

example.com/customers/{customer-ID}

1.{customer-ID}订单:

example.com/customers/{customer-ID}/orders

1.{order-ID}门票:

example.com/customers/{customer-ID}/orders/{order-ID}/tickets

1.{ticket-ID}的消息

example.com/customers/{customer-ID}/orders/{order-ID}/tickets/{ticket-ID}/messages

发现

有一天,我在google上找到了这些qtoes:
1.用户名背后的命名空间功能,如

example.com/{username}/followers

公共功能的绝佳解决方案,这些功能属于每个用户。
1.隐私内容,如账户设置,不应该在用户名后面,而应该在/account/settings后面。
1.最好保持基本资源URL尽可能精简。过滤排序需求、高级搜索分页都可以作为查询参数实现。
1.查询字符串应被视为页面的可选添加;即使URL被删除,它也应该能够产生一个有效和有用页面。
1.在一个好的,可破解的URL中,人类可以调整或删除部分路径,并从您的网站获得预期的结果。它们为访问者提供了更好的页面定位,并使他们能够轻松地提升级别。
1.通过在路径早期嵌入唯一ID,您可以在需要时拥有完整描述性的长URL,但仍然可以享受较短URL的可靠性和ID查找的速度。
1.向URL添加多个关键字可能有助于SEO,但会使用户感到困惑。此外,你很快就会冒着被标记为关键字垃圾邮件发送者的风险。

常见问题

  • 我做错了吗?
    *客户订单票据消息是否需要避免命名空间?
  • 它有什么真实的的重大安全问题吗?

先谢谢你了!

7eumitmz

7eumitmz1#

如果您描述的所有关系都是一对多(而不是多对多),那么我真的看不到您通过URL获得了什么,例如,当订单ID已知时,包含客户ID。它是冗余信息,并且不会在控制器中提供额外的有用信息。
事实上,它可能会导致比预期更复杂的情况,因为现在你必须处理可能是客户订单ID不匹配的情况。您现在必须检查所有这些条件,并在出现这些错误条件时返回错误的请求响应。为什么要增加这些开销?
也许只是:
客户概况:

example.com/customers/{customer-ID}

{customer-ID}的订单:

example.com/customers/{customer-ID}/orders

{order-ID}的门票:

example.com/orders/{order-ID}/tickets

{ticket-ID}的消息

example.com/tickets/{ticket-ID}/messages

但是,如果你有一个多对多的关系,这可能会改变。例如,客户可以输入一个包含多个订单的票证(这意味着票证现在与客户的关系比与订单本身的关系更密切),那么除了上面显示的URL之外,您可能还需要以下URL:
查看给定机票的所有订单:

example.com/tickets/{ticket-ID}/orders

查看客户的所有票证:

example.com/customer/{customer-ID}/tickets
8yoxcaq7

8yoxcaq72#

我做错了吗?
这要看情况而定。你似乎走在正确的道路上,但你最好先决定你的服务应该提供什么功能。否则,你可能会得到无限多的url(资源)来实现。例如,如果您需要在所有客户端上公开订单列表,则需要使用带有查询字符串参数的example.com/orders资源来指定搜索条件。否则,必须首先查询所有客户端,然后在一个循环中向example.com/customers/{customer-ID}/orders发送请求,以获取所有客户端的所有订单。因此,首先考虑您的服务需要公开哪些功能,然后为其设计资源。
它有什么真实的的重大安全问题吗?
它与URL(资源)设计无关。身份验证和授权信息通常放在http头中。
也请考虑添加版本信息到您的网址。当您必须支持多个版本的服务时,它会非常有用

example.com/v1/customers/{customer-ID}/orders

v1.example.com/customers/{customer-ID}/orders

等等的。
最后,如果您要支持资源的多种表示,例如,您可以将客户端列表返回为JSON,XML,HTML等。这是一个很好的做法,指定它在网址以及。因此,请确定默认的表示格式,并将其公开为example.com/customers,然后在url末尾添加格式信息(如果您支持其他格式)。

example.com/customers.xml

example.com/customers.html

等等的。
希望能帮上忙!
我认为在URL中包含ID可能不是一个好的做法
嗯,有两种主要的方法,都有利弊。第一个是使用名称或短资源描述而不是ID。例如,您可以使用其名称example.com/customers/amazon来代替客户端ID,其中amazon是您的客户端名称。该方法的另一个很好的例子是新闻网站,如果你浏览cnn.com,你会看到每篇文章的url都包含文章标题http://edition.cnn.com/2016/06/10/middleeast/israel-tel-aviv-shooting/index.html-“特拉维夫suspect discovered hiding in home of off-duty cop”
从SEO的Angular 来看,这是很棒的,URL变得更具描述性和人性化。但如果你必须更改客户名称,它应该更改URL,并且存在破坏客户端的巨大风险。此外,在实施该方法时,还有很多事情需要记住:

  • 您应该正确地验证客户名称,以便可以将其添加到URL中
  • 您应该禁止更改客户名称,或者通过返回301(“Moved permanently”)并在Location头中指定新的URL来正确处理它,以便客户端知道新的URL
  • 等等的。

ID方法的主要优点是URL总是静态的,你不必为上面的实现内容而烦恼。
从REST的Angular 来看,这两种方法都是有效的,因此由您来决定

相关问题