2012-04-04 40 views
17

Tôi hiện đang thiết kế một API và tôi gặp phải một vấn đề nhỏ: URL của RESTful API trông như thế nào khi bạn có thể xác định một mục bằng ID hoặc sên?Xác định mục bằng ID hoặc một slug trong RESTful API

tôi có thể nghĩ ra ba lựa chọn:

GET /items/<id> 
GET /items/<slug> 

Điều này đòi hỏi sên và ID là phân biệt, mà không nhất thiết phải đưa ra trong trường hợp này. Tôi không thể nghĩ ra một giải pháp sạch cho vấn đề này, ngoại trừ bạn làm điều gì đó như thế này:

GET /items/id/<id> 
GET /items/slug/<slug> 

này sẽ hoạt động tốt, tuy nhiên điều này không phải là nơi duy nhất tôi muốn xác định các mục bằng cách hoặc là một sên hoặc một ID và nó sẽ sớm trở nên xấu xí khi người ta muốn thực hiện cùng một cách tiếp cận cho các hành động khác. Nó chỉ là không phải là rất mở rộng, trong đó đưa chúng ta đến phương pháp này:

GET /items?id=<id> 
GET /items?slug=<slug> 

này có vẻ là một giải pháp tốt, nhưng tôi không biết nếu nó là những gì người ta mong đợi và vì thế nó có thể dẫn đến sai sót bực bội do sử dụng không chính xác. Ngoài ra, nó không phải dễ dàng như vậy - hoặc chúng ta hãy nói sạch - để thực hiện định tuyến cho cái này. Tuy nhiên, nó sẽ là một cách dễ dàng mở rộng và sẽ trông rất giống với phương pháp để nhận nhiều mục:

GET /items?ids=<id:1>,<id:2>,<id:3> 
GET /items?slugs=<slug:1>,<slug:2>,<slug:3> 

Nhưng điều này cũng có một nhược điểm: Nếu ai đó muốn xác định một số mục ông muốn lấy với ID, nhưng những người khác với một con sên? Trộn các định danh này sẽ không dễ dàng đạt được với điều này.

Giải pháp tốt nhất và được chấp nhận rộng rãi nhất cho những vấn đề này là gì? Nói chung, điều gì quan trọng khi thiết kế một API như vậy?

+5

Câu hỏi trong một câu hỏi, sên là gì? –

+0

Wikipedia nói: "một văn bản ngắn thân thiện với người dùng và SEO được sử dụng trong URL để xác định và mô tả tài nguyên" hoặc nội dung tương tự. –

+0

Dựa trên các ví dụ trong bài viết Wikipedia đó và trong bảng thuật ngữ Wordpress (http://codex.wordpress.org/Glossary#Slug), có vẻ như một con sên là một phần của một url đã được phân cấp. Vì vậy, trong trường hợp của bạn có thể là mục cho id, nhưng các mục// (làm ví dụ) là cho sên. –

Trả lời

9

Trong số ba tôi thích tùy chọn thứ ba, không phải là hiếm khi thấy cú pháp đó; ví dụ. các phần của API của Twitter cho phép cú pháp đó: https://dev.twitter.com/rest/reference/get/statuses/show/id

Tùy chọn thứ tư là phương pháp kết hợp, bạn chọn một phương pháp truy cập thông thường cho các mục đơn lẻ, nhưng cũng cho phép truy vấn dựa trên sên. Ví dụ .:

GET /items/<id> 
GET /items?slug=<slug> 
GET /items?id=<id> 

định tuyến của bạn sẽ rõ ràng bản đồ/mục/id để/mục? Id =

Extensible đến nhiều id/sên, nhưng vẫn đáp ứng được các mô hình REST của phù hợp với URI với mô hình dữ liệu cơ bản.

+0

"mô hình REST của các URI phù hợp với mô hình dữ liệu cơ bản." là những gì tôi đang lo lắng. Nhưng tôi đoán tôi sẽ đi với điều này. –

+0

Đó gần như là một câu hỏi của Coke/Pepsi trong những ngày này.:) Tôi sẽ nói bạn nên hỗ trợ/các mục/ để được chứng nhận RESTful, nhưng cũng cho phép chuỗi truy vấn tìm kiếm dựa trên id hoặc slug sẽ nằm trong khuôn mẫu. Và tôi thích Coke hơn. – Mike

+0

Như tôi sẽ có một số tham số truy vấn nhiều hơn cho việc tìm kiếm các mục mà tất cả trở về một mảng, nó sẽ được thông minh để trở lại đây một mảng là tốt? Bạn có thể tìm kiếm sên, nhưng không xác định rõ ràng các mục của chúng, do đó, nó có vẻ hợp lý để trả về một mảng. –