Có bất kỳ hướng dẫn quy ước đặt tên nào cho API REST không? [đóng cửa]


212

Khi tạo API REST, có bất kỳ hướng dẫn hoặc tiêu chuẩn defacto nào để đặt tên cho các quy ước trong API (ví dụ: các thành phần đường dẫn điểm cuối URL, tham số chuỗi truy vấn) không? Là mũ lạc đà là tiêu chuẩn, hoặc gạch dưới? khác?

Ví dụ:

api.service.com/helloWorld/userId/x

hoặc là

api.service.com/hello_world/user_id/x

Lưu ý: Đây không phải là câu hỏi về thiết kế API RESTful, thay vào đó là các nguyên tắc quy ước đặt tên để sử dụng cho các thành phần đường dẫn cuối cùng và / hoặc tham số chuỗi truy vấn được sử dụng.

Bất kỳ hướng dẫn sẽ được đánh giá cao.

Câu trả lời:


150

Tôi nghĩ bạn nên tránh mũ lạc đà. Các tiêu chuẩn là sử dụng chữ in thường. Tôi cũng sẽ tránh dấu gạch dưới và sử dụng dấu gạch ngang thay thế

Vì vậy, URL của bạn sẽ trông như thế này (bỏ qua các vấn đề thiết kế như bạn yêu cầu :-))

api.service.com/hello-world/user-id/x

187
Theo RFC2616, chỉ có phần lược đồ và phần lưu trữ của URL không phân biệt chữ hoa chữ thường. Phần còn lại của URL, tức là đường dẫn và truy vấn NÊN phân biệt chữ hoa chữ thường. w3.org/Prot Protocol / rfc2616 / rfc2616
Darrel Miller

10
Daniel, bạn đã đúng, cảm ơn vì đã chỉ ra điều đó. Tuy nhiên, thực tế chúng ta thường mong đợi các url bỏ qua các trường hợp, đặc biệt là phần tên tài nguyên. Sẽ không có nghĩa gì khi userid & UserId cư xử khác đi (trừ khi một trong số họ trả về 404)
LiorH

18
@LiorH: Tại sao bạn nghĩ nó "không có ý nghĩa" là phân biệt chữ hoa chữ thường? Rất nhiều bối cảnh khác là trường hợp nhạy cảm với hiệu quả tốt. Có một số dịch vụ web (ví dụ như Amazon S3) mà làm thi nhạy trường hợp cho các điểm cuối URL, và tôi nghĩ nó khá thích hợp.
Hank

6
Hệ thống tập tin máy chủ @Dennis Windows là trường hợp nhạy cảm theo mặc định, trừ khi tôi vô cùng sai lầm technet.microsoft.com/en-us/library/cc725747.aspx
samspot

5
@samspot Tốt một! Tôi nghĩ rằng các cửa sổ đã đi thẳng vào trường hợp tên tệp nhạy cảm khi họ tạo máy chủ. WOW, họ vẫn đang thúc đẩy con đường của họ càng lâu càng tốt, tức là "1 MicroSoft Way". ;-)
Dennis

87

API REST cho Dropbox , Twitter , Google Web ServicesFacebook đều sử dụng dấu gạch dưới.


24
Một trong những tác dụng phụ của điều đó là các 'từ' được gạch dưới được giữ nguyên, cùng với nhau trong các chỉ mục tìm kiếm của google. Những người bị suy nhược được chia thành các từ riêng biệt.
Dennis


11
Mặc dù API Google Maps sử dụng dấu gạch dưới, Google Style Guide yêu cầu Vỏ lạc đà. Các API Google+Custom Search API , trong số những người khác, sử dụng Camel Case.
Benjamin

2
Tuy nhiên, họ vẫn sử dụng '-' làm dấu phân tách các url đó: P developers.google.com/custom-search/json-api/v1/reference/cse/ các nhà phát triển của nhà phát triển.google.com/+/best-practices dev.twitter. com / tổng quan / nghiên cứu trường hợp Mặt khác, họ sử dụng camelCase trong các tham số truy vấn.
Mattias

1
Không ai biết ...
Piotr Kula

84

Nhìn kỹ vào URI cho các tài nguyên web thông thường. Đó là những mẫu của bạn. Hãy nghĩ về cây thư mục; sử dụng tên tệp và thư mục giống như Linux.

HelloWorldkhông phải là một lớp tài nguyên thực sự tốt. Nó không có vẻ là một "điều". Nó có thể, nhưng nó không giống như danh từ. A greetinglà một điều.

user-idcó thể là một danh từ mà bạn đang tìm nạp. Tuy nhiên, điều đáng nghi ngờ là kết quả yêu cầu của bạn chỉ là user_id. Nhiều khả năng kết quả của yêu cầu là Người dùng. Do đó, userlà danh từ bạn đang tìm nạp

www.example.com/greeting/user/x/

Có nghĩa với tôi. Tập trung vào việc làm cho REST của bạn yêu cầu một loại cụm danh từ - một đường dẫn thông qua hệ thống phân cấp (hoặc phân loại hoặc thư mục). Sử dụng các danh từ đơn giản nhất có thể, tránh các cụm danh từ nếu có thể.

Nói chung, cụm danh từ ghép thường có nghĩa là một bước khác trong hệ thống phân cấp của bạn. Vì vậy, bạn không có /hello-world/user//hello-universe/user/. Bạn có /hello/world/user/hello/universe/user/. Hoặc có thể /world/hello/user//universe/hello/user/.

Vấn đề là cung cấp một đường dẫn giữa các tài nguyên.


4
Câu hỏi của tôi liên quan nhiều hơn đến quy ước đặt tên của các tên đường dẫn cuối cùng và / hoặc các tham số chuỗi truy vấn bất kể chúng có thể là gì. Tôi đồng ý với các đề xuất thiết kế của bạn, vì vậy cảm ơn bạn, nhưng với câu hỏi này tôi chỉ hỏi về quy ước đặt tên.
jnorris

1
Chỉ cần lưu ý, không có gì ngăn bạn sử dụng REST cho các tài nguyên không phân cấp. Các quy ước đặt tên URI thực tế mà bạn sử dụng là không quan trọng, chỉ cần sử dụng bất cứ thứ gì bạn cho là đẹp mắt và dễ dàng để bạn phân tích cú pháp trên máy chủ. Máy khách không nên biết bất cứ điều gì về việc tạo URI của bạn vì bạn cần gửi URI tới các tài nguyên thông qua siêu văn bản trong các phản hồi của bạn.
aehlke

30

'UserId' hoàn toàn là cách tiếp cận sai. Cách tiếp cận Động từ (Phương thức HTTP) và Danh từ là ý nghĩa của Roy Fielding cho kiến trúc REST . Các danh từ là:

  1. Một Bộ sưu tập thứ
  2. Một điều

Một quy ước đặt tên tốt là:

[POST or Create](To the *collection*)
sub.domain.tld/class_name.{media_type} 

[GET or Read](of *one* thing)
sub.domain.tld/class_name/id_value.{media_type}

[PUT or Update](of *one* thing)
sub.domain.tld/class_name/id_value.{media_type}

[DELETE](of *one* thing)
sub.domain.tld/class_name/id_value.{media_type}

[GET or Search](of a *collection*, FRIENDLY URL)
sub.domain.tld/class_name.{media_type}/{var}/{value}/{more-var-value-pairs}

[GET or Search](of a *collection*, Normal URL)
sub.domain.tld/class_name.{media_type}?var=value&more-var-value-pairs

Trong đó {media_type} là một trong: json, xml, rss, pdf, png, thậm chí html.

Có thể phân biệt bộ sưu tập bằng cách thêm một 's' ở cuối, như:

'users.json' *collection of things*
'user/id_value.json' *single thing*

Nhưng điều này có nghĩa là bạn phải theo dõi nơi bạn đã đặt 's' và nơi bạn chưa có. Cộng với một nửa hành tinh (người châu Á cho người mới bắt đầu) nói các ngôn ngữ mà không có số nhiều rõ ràng nên URL không thân thiện với họ.


Có nghĩa là gì với {var}? Nếu tôi tìm kiếm một người dùng theo tên sẽ là ví dụ ... / user / username / tomsawyer?
Hans-Peter Störr

1
Nếu bạn có ba biến (var) có tên x, y, z, thì URL của bạn sẽ giống như: sub.domain.tld / x / value_of_x / y / value_of_y / z / value_of_z
Dennis

@hstoerr Chỉ cần chắc chắn rằng tôi đã rõ ràng, hầu hết các ngôn ngữ tập lệnh sử dụng một số loại 'thay thế biến đổi khung cong'. Vì vậy, {var} biểu thị rằng một số biến (tên của nó) nằm ở đó và vì vậy {value} sau đây là nơi giá trị của {var} trước nó. Ví dụ: sub.domain.tld / script / {var} / {value} .json [www.yelp.com/food giác / review_a Average_higher_than / .4] giá trị cao hơn 4.
Dennis

Đây là câu trả lời tốt nhất theo quan điểm của tôi và danh tiếng cho tư duy quốc tế.
beiller

14

Không. REST không liên quan gì đến các quy ước đặt tên URI. Nếu bạn bao gồm các quy ước này như một phần của API, ngoài băng tần, thay vì chỉ thông qua siêu văn bản, thì API của bạn không phải là RESTful.

Để biết thêm thông tin, hãy xem http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven


44
Hãy cho nó nghỉ ngơi ... thật tuyệt khi có các URL trông đẹp mắt.
HDave

1
Đồng ý với @HDave, theo tinh thần của REST là có các URL dễ hiểu. Bạn đang làm việc với các URL, tại sao bạn không muốn chúng dễ hiểu như tên biến và tham số trong mã của bạn?
mahemoff

4
@mahemoff xin lỗi, đây là tôi siêu phàm. Nhưng những gì URL của bạn trông không liên quan gì đến REST. Điều đó không có nghĩa là chúng không phải là một thứ tốt để có, chúng chỉ là trực giao với những gì REST mô tả. Thật sai lầm khi nói rằng REST nói về cấu trúc URL theo cách này, vì nó dẫn đến việc mọi người mô tả API RPC là REST chỉ vì họ có URL có thể đọc / cấu trúc.
aehlke

5
Tóm lại, các URL đẹp mắt là tuyệt vời và mọi người nên có chúng. Nó không có gì để làm với REST mặc dù.
aehlke

1
@aehlke cảm ơn vì đã làm rõ điều này. Phần còn lại không phải là về cấu trúc URL. Tôi không hiểu tại sao mọi người khó hiểu như vậy.
dùng14 31072

9

Tên miền không phân biệt chữ hoa chữ thường nhưng phần còn lại của URI chắc chắn có thể. Đó là một sai lầm lớn khi cho rằng URI không phân biệt chữ hoa chữ thường.



2

Tôi không nghĩ trường hợp lạc đà là vấn đề trong ví dụ đó, nhưng tôi tưởng tượng một quy ước đặt tên RESTful hơn cho ví dụ trên sẽ là:

api.service.com/helloWorld/userId/x

thay vì sau đó biến userId thành một tham số truy vấn (hoàn toàn hợp pháp) ví dụ của tôi biểu thị tài nguyên đó trong IMO, một cách RESTful hơn.


Đây không phải là một câu hỏi về thiết kế API RESTful, thay vào đó là các nguyên tắc quy ước đặt tên để sử dụng cho các thành phần đường dẫn cuối cùng và / hoặc các tham số chuỗi truy vấn được sử dụng. Trong ví dụ của bạn, các thành phần đường dẫn phải ở trong mũ lạc đà như bạn đã sử dụng, hoặc gạch dưới?
jnorris

Vì trong REST, URL của bạn là giao diện của bạn, nên đây là một câu hỏi API. Mặc dù tôi không nghĩ rằng có bất kỳ hướng dẫn cụ thể nào cho ví dụ của bạn, nhưng tôi sẽ đi riêng với trường hợp lạc đà.
Gandalf

Bạn không nên sử dụng các tham số truy vấn cho các tài nguyên mà bạn muốn được lưu trữ ở bất kỳ cấp độ nào của ngăn xếp HTTP.
aehlke

@aehlke Điều ngược lại cũng đúng. Nếu bạn không muốn lưu các tham số truy vấn, hãy sử dụng kiểu GET cho các tham số, ~ HOẶC ~ tạo DARN SURE để sửa đổi / chèn các tiêu đề chống bộ đệm cho bất cứ điều gì bạn không muốn lưu vào bộ đệm. Ngoài ra, đây là một số tiêu đề là hàm băm của returend đối tượng / trang, sử dụng tiêu đề đó để chỉ ra những thay đổi của những thứ bạn muốn lưu vào bộ nhớ cache, nhưng được cập nhật khi có chỉnh sửa.
Dennis

@aehlke Tìm hiểu về bộ nhớ đệm và đang thêm nó. Tôi nhớ một bản trình bày CodeCamp trong đó một trong những người tăng tốc đã thực hiện tất cả các tiêu đề này, sau đó thay đổi tên tệp và tất cả các tham chiếu đến nó khi nội dung của nó thay đổi để đưa borwsers và proxy đến máy chủ phiên bản mới hơn sau một thời gian lưu trữ bộ đệm dài bộ. Dưới đây là tất cả các thông tin chi tiết: developers.google.com/speed/docs/best-practices/caching
Dennis

2

Nếu bạn xác thực ứng dụng khách của mình bằng Oauth2, tôi nghĩ bạn sẽ cần gạch dưới cho ít nhất hai tên tham số của mình:

  • khách hàng
  • khách hàng

Tôi đã sử dụng camelCase trong API REST (chưa được công bố) của mình. Trong khi viết tài liệu API, tôi đã nghĩ đến việc thay đổi mọi thứ thành Snake_case vì vậy tôi không phải giải thích tại sao các thông số Oauth lại là sn_case trong khi các thông số khác thì không.

Xem: https://tools.ietf.org/html/rfc6749


0

Tôi muốn nói rằng nên sử dụng càng ít ký tự đặc biệt càng tốt trong các URL REST. Một trong những lợi ích của REST là nó làm cho "giao diện" cho một dịch vụ dễ đọc. Vỏ lạc đà hoặc vỏ Pascal có lẽ tốt cho tên tài nguyên (Người dùng hoặc người dùng). Tôi không nghĩ rằng thực sự có bất kỳ tiêu chuẩn cứng nào xung quanh REST.

Ngoài ra, tôi nghĩ Gandalf đã đúng, thường thì REST sẽ sạch hơn khi không sử dụng các tham số chuỗi truy vấn, mà thay vào đó, tạo các đường dẫn xác định tài nguyên nào bạn muốn xử lý.

http://api.example.com/HelloWorld/Users/12345/Order/3/etc

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.