Các URL của bạn trông như thế nào không liên quan gì đến REST. Bất cứ điều gì đi. Nó thực sự là một "chi tiết thực hiện". Vì vậy, giống như cách bạn đặt tên cho các biến của bạn. Tất cả chúng phải là duy nhất và bền.
Đừng lãng phí quá nhiều thời gian cho việc này, chỉ cần đưa ra lựa chọn và kiên định với nó / nhất quán. Ví dụ: nếu bạn đi với hệ thống phân cấp thì bạn làm điều đó cho tất cả các tài nguyên của bạn. Nếu bạn đi với các tham số truy vấn ... vv giống như các quy ước đặt tên trong mã của bạn.
Tại sao vậy ? Theo như tôi biết API "RESTful" có thể duyệt được (bạn biết ... "Hypermedia là Công cụ của Trạng thái Ứng dụng"), do đó, ứng dụng API không quan tâm đến URL của bạn như thế nào miễn là chúng hợp lệ (không có SEO, không có con người cần đọc những "url thân thiện" đó, ngoại trừ có thể để gỡ lỗi ...)
URL đẹp như thế nào / dễ hiểu trong API REST chỉ thú vị đối với bạn với tư cách là nhà phát triển API, không phải ứng dụng khách API, như tên của một biến trong mã của bạn.
Điều quan trọng nhất là ứng dụng khách API của bạn biết cách diễn giải loại phương tiện của bạn. Ví dụ, nó biết rằng:
- loại phương tiện của bạn có thuộc tính liên kết liệt kê các liên kết có sẵn / liên quan.
- Mỗi liên kết được xác định bởi một mối quan hệ (giống như các trình duyệt biết rằng liên kết [rel = "biểu định kiểu"] có nghĩa là biểu định kiểu hoặc rel = favico là liên kết đến favicon ...)
- và nó biết ý nghĩa của các mối quan hệ đó ("công ty" có nghĩa là danh sách các công ty, "tìm kiếm" có nghĩa là url được tạo khuôn mẫu để thực hiện tìm kiếm trên danh sách tài nguyên, "bộ phận" có nghĩa là bộ phận của tài nguyên hiện tại)
Dưới đây là một ví dụ trao đổi HTTP (các nội dung nằm trong yaml vì nó dễ viết hơn):
Yêu cầu
GET / HTTP/1.1
Host: api.acme.io
Accept: text/yaml, text/acme-mediatype+yaml
Trả lời: danh sách các liên kết đến tài nguyên chính (công ty, con người, bất cứ điều gì ...)
HTTP/1.1 200 OK
Date: Tue, 05 Apr 2016 15:04:00 GMT
Last-Modified: Tue, 05 Apr 2016 00:00:00 GMT
Content-Type: text/acme-mediatype+yaml
# body: this is your API's entrypoint (like a homepage)
links:
# could be some random path https://api.acme.local/modskmklmkdsml
# the only thing the API client cares about is the key (or rel) "companies"
companies: https://api.acme.local/companies
people: https://api.acme.local/people
Yêu cầu: liên kết đến các công ty (sử dụng phản hồi trước đó là body.links.compiances)
GET /companies HTTP/1.1
Host: api.acme.local
Accept: text/yaml, text/acme-mediatype+yaml
Trả lời: một danh sách một phần các công ty (theo mục), tài nguyên chứa các liên kết liên quan, như liên kết để có được một vài công ty tiếp theo (body.links.next) một liên kết (templated) khác để tìm kiếm (body.links.search)
HTTP/1.1 200 OK
Date: Tue, 05 Apr 2016 15:06:00 GMT
Last-Modified: Tue, 05 Apr 2016 00:00:00 GMT
Content-Type: text/acme-mediatype+yaml
# body: representation of a list of companies
links:
# link to the next page
next: https://api.acme.local/companies?page=2
# templated link for search
search: https://api.acme.local/companies?query={query}
# you could provide available actions related to this resource
actions:
add:
href: https://api.acme.local/companies
method: POST
items:
- name: company1
links:
self: https://api.acme.local/companies/8er13eo
# and here is the link to departments
# again the client only cares about the key department
department: https://api.acme.local/companies/8er13eo/departments
- name: company2
links:
self: https://api.acme.local/companies/9r13d4l
# or could be in some other location !
department: https://api2.acme.local/departments?company=8er13eo
Vì vậy, như bạn thấy nếu bạn đi theo cách liên kết / quan hệ, cách bạn cấu trúc phần đường dẫn của URL không có bất kỳ giá trị nào đối với ứng dụng khách API của bạn. Và nếu bạn đang truyền đạt cấu trúc URL của mình tới khách hàng của mình dưới dạng tài liệu, thì bạn không thực hiện REST (hoặc ít nhất là không phải Cấp 3 theo " mô hình trưởng thành của Richardson ")