2016-06-09 98 views
0

現狀

我開發的PHP的在線訂單管理系統應用程序,我需要通過URL方案設計REST資源映射。如何組織資源在Web應用程序的URL結構

我有典型的資源:

  • 客戶(有訂單)
  • 訂單(有票)
  • 票務(有消息)
  • 消息

我想到的是這樣的:

  1. 客戶概況:

    example.com/customers/{customer-ID} 
    
  2. 訂單爲{客戶ID}:

    example.com/customers/{customer-ID}/orders 
    
  3. {或DER-ID}:

    example.com/customers/{customer-ID}/orders/{order-ID}/tickets 
    
  4. 消息{票ID}

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

發現

谷歌搜索的

有一天,我發現這些qutoes:

  1. 的用戶名後面的命名空間功能,如

    example.com/{username}/followers 
    

    公共功能屬於每個用戶單獨偉大的解決方案。

  2. 私人的東西,比如帳戶設置,不應該的用戶名背後命名空間,並且應該只出現/account/settings之後。

  3. 這是最好保持基本資源的URL結構儘量緊湊,。過濾器,分揀要求,先進搜索分頁可以爲查詢參數得到落實。

  4. 的查詢字符串應該被視爲一個可選除了頁面;該網址應該能夠生成有效且有用的網頁,即使該網頁已被刪除。

  5. 在一個良好的,破解的URL,人類可以調整或刪除路徑的部分,並從您的網站預期的結果。它們可以讓您的訪問者更好地定位您的頁面,並使他們輕鬆向上移動。

  6. 通過在你的路徑早就嵌入一個唯一的ID,你可以在需要時有長,完全採用描述性網址,但仍享受較短的網址的可靠性和ID查找的速度。

  7. 添加多個關鍵字網址可以與SEO的幫助,但它會混淆用戶。此外,您很快就會冒着被標記爲關鍵字垃圾郵件發送者的風險。

問題

  • 我做的事情錯了嗎?
  • 我應該避免命名空間客戶訂單門票消息
  • 它是否有任何真正的重大安全問題?

在此先感謝!

回答

1

如果您描述的所有關係都是一對多關係(而非多對多關係),那麼我並不真正看到通過擁有這些關鍵字所帶來的收益,例如,包含客戶ID,而訂單ID是衆所周知。這是冗餘信息,並且不會在控制器中提供其他有用的信息。

事實上,它可能會導致比預期更多的複雜性,因爲現在您必須處理可能是客戶訂購ID不匹配的情況。您現在必須檢查所有這些條件,並在發生不良情況時返回錯誤的請求響應。爲什麼要增加開銷?

也許只是:

客戶概況:

example.com/customers/{customer-ID} 

訂單爲{客戶ID}:

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

門票{訂單編號}:

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

留言{ticket-ID}

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

如果您有多對多的關係,這可能會改變。例如,假設客戶可以輸入涵蓋多個訂單的單個票據(這意味着現在票據與訂單本身的關係比訂單本身更多),那麼除了上面顯示的訂單之外,您可能還需要類似以下的URL:

查看所有訂單給定的票:

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

查看所有的門票的客戶:

example.com/customer/{customer-ID}/tickets 
+0

在烏爾建議的方案,是什麼'example.com/customers/ {客戶ID}/orders'和'例子之間的差異。 COM/orders'? – Trix

+0

@Trix'/ orders'可能會列出所有訂單,而'/ customers/{customer-ID}/orders'會列出該客戶ID的所有訂單。 –

+0

然後,當客戶訪問'/ orders'他應該看到什麼?一條**訪問被拒絕!**消息? – Trix

0

我做的事情錯了嗎?

這取決於。你似乎在正確的軌道上,但你最好決定你的服務應該首先提供什麼功能。否則,您最終可能會實現無限數量的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等返回,因此最好在URL中指定它。所以決定你的默認表示格式,並公開爲example.com/customers,然後添加格式信息的URL的末尾,如果你支持其他

example.com/customers.xml 

example.com/customers.html 

希望它幫助!

我認爲包括URL標識可能不是一個很好的做法

那麼,有兩種主要的方法,並都有它利弊和prons。第一個是使用名稱或簡短資源摘要而不是ID。例如,您可以使用其名稱example.com/customers/amazon而不是客戶端ID,其中amazon是您的客戶端名稱。該方法的另一個很好的例子是新聞網站,如果你通過cnn.com導航,你會看到每一篇文章的網址包含文章標題http://edition.cnn.com/2016/06/10/middleeast/israel-tel-aviv-shooting/index.html - 「特拉維夫犯罪嫌疑人發現藏在休班警察之家」

這是從SEO的角度來看大而且網址變得更具描述性和人性化。但是,如果你必須改變你的客戶名稱,它應該改變網址,並且存在破壞客戶的巨大風險。除此之外還有很多事情要記住,同時實施的辦法:

  • 你應該正確地驗證客戶的名稱,以便他們確定要添加到URL
  • 你不應該允許更改客戶名稱或妥善處理通過返回301(「感動永久」),並在指定位置標頭中的新的URL,以便客戶端知道新的URL

標識方法的主要優點是,網址是總是靜止的,你不必擔心上面的實現東西。

兩種方法都是從靜止的角度有效,所以它的你來決定

+0

**所以首先考慮你的服務需要公開什麼功能,然後爲它設計資源。**:客戶有訂單,而訂單又可能有票,每個票有多個消息。功能很明顯,因爲客戶應該能夠提交訂單。在他們的訂單上提交票據並將消息添加到他們的票據 – Trix

+0

@Trix是的,但您可能有管理員可能需要按照我的答案中所述的方式查詢所有客戶端的訂單,但可能還有其他情況,如Mike所述。這只是一個建議,所以你不會錯過任何事情。如果你在上面指定的是你所服務的所有應該暴露的東西,那麼你就在我的回答 –

+0

中說的正確軌道,謝謝,但很明顯,任何應用程序都需要一些管理員的東西。我想知道是否將資源公開爲資源,是否是一種好的做法,通過令人信服的證據予以支持 – Trix