2009-04-22 28 views
166

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

Ví dụ:

api.service.com/helloWorld/userId/x 

hoặc

api.service.com/hello_world/user_id/x 

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

Mọi nguyên tắc sẽ được đánh giá cao.

Trả lời

123

Tôi nghĩ bạn nên tránh mũ lạc đà.Định mức là sử dụng chữ thường. Tôi cũng muốn tránh dấu gạch dưới và dấu gạch ngang sử dụng thay vì

Vì vậy, URL của bạn sẽ giố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 
+170

Theo RFC2616 chỉ các sơ đồ và các 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. http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.3 –

+7

Daniel, bạn nói đúng, cảm ơn vì đã chỉ ra điều đó. Tuy nhiên, trên thực tế, chúng tôi 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. Nó sẽ không có ý nghĩa cho userid & UserId để hành xử khác nhau (trừ khi một trong số họ trả về 404) – LiorH

+16

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

2

Tôi không nghĩ rằng các 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 đó làm cho userId 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.

+0

Đây không phải là một vấn đề thiết kế API RESTful, chứ không phải chủ trương quy ước đặt tên để sử dụng cho các thành phần con đường cuối cùng và/hoặc các thông số chuỗi truy vấn sử dụng.Trong ví dụ của bạn, các thành phần đường dẫn có nằm trong các nút lạc đà như bạn đã sử dụng hay dấu gạch dưới không? – jnorris

+0

Cũng vì trong REST URL của bạn là giao diện của bạn, sau đó nó là một loại câu hỏi API. Trong khi tôi không nghĩ rằng có bất kỳ hướng dẫn cụ thể cho ví dụ của bạn, tôi sẽ đi với trường hợp lạc đà cá nhân. – Gandalf

+0

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

1

Tôi có thể nói rằng nên sử dụng càng ít ký tự đặc biệt càng tốt trong 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. Trường hợp lạc đà hoặc trường hợp 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ĩ có bất kỳ tiêu chuẩn cứng nào xung quanh REST.

Ngoài ra, tôi nghĩ Gandalf là đúng, nó thường sạch hơn trong REST để không sử dụng tham số chuỗi truy vấn, nhưng thay vào đó tạo đườ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

73

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

HelloWorld không phải là một loại tài nguyên thực sự tốt. Nó không phải là một "điều". Nó có thể là, nhưng nó không phải là rất giống như danh từ. A greeting là một điều.

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

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

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

Nói chung, cụm từ danh từ kép thường có nghĩa là một bước khác trong cấu trúc 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ể là /world/hello/user//universe/hello/user/.

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

+3

Câu hỏi của tôi có 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 tham số chuỗi truy vấn bất kể chúng có thể là gì. Tôi đồng ý với bạn đề xuất thiết kế, 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ứ điều gì bạn nghĩ có vẻ đẹp và dễ dàng để bạn phân tích cú pháp trên máy chủ. Máy khách không biết gì về việc tạo các URI của bạn vì bạn cần gửi các URI tới các tài nguyên thông qua siêu văn bản trong các câu trả lời của bạn. – aehlke

14

số REST của không có gì để làm với 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, thay vì chỉ 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, xem http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven

+36

Hãy cho nó một phần còn lại ... nó vẫn còn tốt đẹp để có các URL đẹp. – HDave

+1

Đồng ý với @HDave, rất nhiều trong tinh thần của REST để 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ư biến và tên tham số trong mã của bạn? – mahemoff

+4

@mahemoff xin lỗi, đây là tôi là siêu pedantic. Nhưng URL của bạn trông như thế nào chẳng liên quan gì đến REST. Điều đó không có nghĩa là chúng không phải là một điều 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 là về cấu trúc các URL theo cách này, vì nó dẫn đến những người mô tả các API RPC như REST chỉ vì chúng có các URL có thể đọc/có cấu trúc. – aehlke

9

Tên miền không phân nhạy cảm nhưng phần còn lại của URI chắc chắn có thể được. Đó là một sai lầm lớn để giả định URI không phân biệt chữ hoa chữ thường.

73

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

+13

Một trong những tác dụng phụ của điều đó là các từ 'gạch dưới' được giữ nguyên, cùng với 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

+0

Ví dụ: https://dev.twitter.com/docs/api/1.1 –

+7

Mặc dù API Google Maps sử dụng dấu gạch dưới, [Hướng dẫn kiểu Google] (http://google-styleguide.googlecode.com/svn/trunk /jsoncstyleguide.xml?showone=Property_Name_Format#Property_Name_Format) yêu cầu Camel Case. [API Google+] (https://developers.google.com/+/api/latest/activities/list) và [API tìm kiếm tùy chỉnh] (https://developers.google.com/custom-search/json-api/v1/reference/cse/list), trong số những người khác, sử dụng Camel Case. – Benjamin

26

'UserId' hoàn toàn là phương pháp sai. Phương pháp động từ (phương pháp HTTP) và danh từ là những gì Roy Fielding có nghĩa là cho The REST architecture. Các danh từ là một trong hai:

  1. Một Collection 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 

đâu {MEDIA_TYPE} là một trong những : json, xml, rss, pdf, png, thậm chí html.

Có thể phân biệt các 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 về nơi bạn đã đặt 's' và nơi bạn không. 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 ngôn ngữ không có số nhiều rõ ràng để URL ít thân thiện hơn với chúng.

+1

Roy, không phải Rob :) – tuespetre

+0

Điều gì có nghĩa là 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? –

+1

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

1

Nếu bạn xác thực khách hàng của bạn với OAuth2 Tôi nghĩ rằng bạn sẽ cần phải nhấn mạnh trong ít nhất hai tên tham số của bạn:

  • client_id
  • client_secret

Tôi đã sử dụng camelCase trong tôi (chưa được xuất bản) REST API. 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 tham số Oauth là snake_case trong khi các tham số khác thì không.

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

Các vấn đề liên quan