Các động từ và hành động url RESTful hay nhất / phổ biến nhất là gì?


86

Tôi đang cố gắng tìm một số thông tin về các hành động RESTful url tốt nhất và phổ biến nhất.

ví dụ: bạn sử dụng url nào để hiển thị chi tiết của một mục, để chỉnh sửa mục, cập nhật, v.v.

/question/show/<whatever>
/question/edit/<whatever>
/question/update/<whatever> (this is the post back url)
/question/list   (lists the questions)

hmm. cảm ơn bất cứ ai giúp đỡ :)

Câu trả lời:


173

Sử dụng URL để chỉ định các đối tượng của bạn, không phải hành động của bạn:

Lưu ý những gì bạn đề cập đầu tiên không phải là RESTful:

/questions/show/<whatever>

Thay vào đó, bạn nên sử dụng URL để chỉ định các đối tượng của mình:

/questions/<question>

Sau đó, bạn thực hiện một trong các thao tác dưới đây trên tài nguyên đó.


ĐƯỢC:

Được sử dụng để lấy một tài nguyên, truy vấn danh sách tài nguyên và cũng để truy vấn thông tin chỉ đọc trên một tài nguyên.

Để lấy nguồn câu hỏi:

GET /questions/<question> HTTP/1.1
Host: whateverblahblah.com

Để liệt kê tất cả các nguồn câu hỏi:

GET /questions HTTP/1.1
Host: whateverblahblah.com

BÀI ĐĂNG:

Được sử dụng để tạo một tài nguyên.

Lưu ý rằng sau đây là một lỗi:

POST /questions/<new_question> HTTP/1.1
Host: whateverblahblah.com

Nếu URL chưa được tạo, bạn không nên sử dụng POST để tạo nó trong khi chỉ định tên. Điều này sẽ dẫn đến lỗi không tìm thấy tài nguyên vì chưa tồn tại. Bạn nên PUT tài nguyên trên máy chủ trước. Bạn có thể lập luận rằng bằng cách tạo một câu hỏi mới, bạn cũng đang cập nhật tài nguyên / câu hỏi vì bây giờ nó sẽ trả lại một câu hỏi nữa trong danh sách câu hỏi của nó.

Bạn nên làm như thế này để tạo tài nguyên bằng cách sử dụng POST:

POST /questions HTTP/1.1
Host: whateverblahblah.com

Lưu ý rằng trong trường hợp này, tên tài nguyên không được chỉ định, đường dẫn URL đối tượng mới sẽ được trả lại cho bạn.

XÓA BỎ:

Được sử dụng để xóa tài nguyên.

DELETE /questions/<question> HTTP/1.1
Host: whateverblahblah.com

ĐẶT:

Được sử dụng để tạo tài nguyên hoặc ghi đè tài nguyên trong khi bạn chỉ định URL tài nguyên.

Đối với một tài nguyên mới:

PUT /questions/<new_question> HTTP/1.1
Host: whateverblahblah.com

Để ghi đè tài nguyên hiện có:

PUT /questions/<existing_question> HTTP/1.1
Host: whateverblahblah.com

...Vâng, họ giống nhau. PUT thường được mô tả là phương pháp 'chỉnh sửa', vì bằng cách thay thế toàn bộ tài nguyên bằng một phiên bản được thay đổi một chút, bạn đã chỉnh sửa những gì khách hàng sẽ NHẬN được khi họ làm lần sau.


Sử dụng REST trong các biểu mẫu HTML:

Đặc tả HTML5 xác định GET và POST cho phần tử biểu mẫu .

Thuộc tính nội dung phương pháp là một thuộc tính liệt kê với các từ khóa và trạng thái sau:

  • Từ khóa GET, ánh xạ tới trạng thái GET, cho biết phương thức HTTP GET.
  • Từ khóa POST, ánh xạ tới trạng thái POST, cho biết phương thức HTTP POST.

Về mặt kỹ thuật, đặc tả HTTP không giới hạn bạn chỉ với những phương thức đó. Về mặt kỹ thuật, bạn có thể tự do thêm bất kỳ phương pháp nào bạn muốn, tuy nhiên, trên thực tế, đây không phải là một ý kiến ​​hay. Ý tưởng là tất cả mọi người đều biết rằng bạn sử dụng GET để đọc dữ liệu, vì vậy sẽ gây nhầm lẫn nếu bạn quyết định sử dụng ĐỌC. Mà nói...

VÁ:

Đây là một phương thức đã được định nghĩa trong một RFC chính thức. Nó được thiết kế để sử dụng khi bạn chỉ muốn gửi một sửa đổi một phần cho tài nguyên, nó sẽ được sử dụng giống như PUT:

PATCH /questions/<new_question> HTTP/1.1
Host: whateverblahblah.com

Sự khác biệt là PUT phải gửi toàn bộ tài nguyên, không có vấn đề lớn như thế nào nó được so sánh với những gì đang thực sự thay đổi, trong khi PATCH bạn có thể gửi chỉ các thay đổi.


Chào Brian .. tôi càng đọc điều này, nó càng có ý nghĩa. Tôi giả sử rằng một số trình duyệt (hoặc phiên bản trình duyệt) không hỗ trợ PUT hoặc DELETE? nếu đúng như vậy, chúng ta có sử dụng POST để thay thế không?
Pure.Krome

1
Xin chào Pure.Knome; Các trình duyệt web hỗ trợ tất cả chúng, bất kỳ thư viện HTTP nào cũng phải hỗ trợ tất cả chúng.
Brian R. Bondy

4
Nhân tiện tôi khuyên bạn nên mua cuốn sách này nếu bạn muốn tìm hiểu tất cả về REST oreilly.com/catalog/9780596529260
Brian R. Bondy

1
@Brian: một vài câu hỏi nữa về các ví dụ PUT của bạn. >> PUT / question / <new_question> Tại sao bạn làm điều đó, thay vì làm >> PUT / question / bởi vì tất cả dữ liệu trong biểu mẫu sẽ được sử dụng để tạo tài nguyên mới? (tiếp tục bình luận tiếp theo) ...
Pure.Krome

1
@Brian R. Bondy, Cảm ơn câu trả lời tuyệt vời của bạn. Yêu cầu ĐĂNG tới tài nguyên hiện có được mô tả là "đang bổ sung" trong cuốn sách yên bình của oreilly (pg: 100,101), trái với thuật ngữ "sửa đổi" chung của bạn. Xét cho cùng, việc nối thêm cụ thể hơn là sửa đổi - có thể chuyển tải "PUT đến một tài nguyên hiện có" - và về mặt ngữ nghĩa nghe có vẻ đúng hơn đối với POST - thêm tài nguyên mới vào liên kết được chỉ định, bằng cách thêm vào hoặc tạo một tài nguyên con vào đó .
Özgür

11

Giả sử /questions/10là một câu hỏi hợp lệ thì phương pháp được sử dụng để tương tác với nó.

ĐĂNG để thêm vào nó

PUT để tạo hoặc thay thế nó

NHẬN để xem / truy vấn nó

và DELETE để tốt .. xóa nó.

Url không thay đổi.


4
Sai lầm. PUT phải là idmpotent. Bạn phải có thể thực hiện cùng một yêu cầu PUT nhiều lần, không có hiệu lực sau lần đầu tiên. Vì vậy, việc tạo tài nguyên với mọi yêu cầu PUT không phải là điều cần thiết.
aehlke

3
"Các phương thức PUT và DELETE được định nghĩa là không thể thay thế được, có nghĩa là nhiều yêu cầu giống hệt nhau sẽ có cùng tác động như một yêu cầu duy nhất." Ngay lập tức PUTting lại sẽ làm lại lần nữa mà không có tác dụng. Bằng cách này, bạn đang tạo một tài nguyên, nhưng truy vấn vẫn là không quan trọng. Nếu sau đó bạn quay lại và muốn thay đổi tài nguyên, bạn sẽ PUT đến cùng một URI với dữ liệu khác nhau (đó sẽ là một yêu cầu khác và bản thân nó có thể được lặp lại nhiều lần với cùng một kết quả).
Allain Lalonde

1
Trên thực tế, hãy xem câu trả lời nhận được 25 phiếu bầu ở trên, nó đã tuyên bố rằng PUT có thể được sử dụng để tạo hoặc thay thế một tài nguyên.
Allain Lalonde

3
Việc tạo chỉ hoạt động miễn là cho phép chỉ định ID của tài nguyên mới. Mặc dù điều này có thể xảy ra, nhưng người dùng thường dễ dàng ĐĂNG lên / bộ sưu tập và được trả về các liên kết bao gồm id mới:
pgraham

2
@aehIke Việc tạo tài nguyên mới bởi PUT không làm cho nó trở nên không quan trọng vì ý tưởng là nếu tôi 'PUT / items / 10' và mục 10 không tồn tại trước đó, thì nó sẽ chỉ được tạo. Tuy nhiên, nếu tôi 'PUT / items / 10' lại lần thứ hai, thì bây giờ nó đã tồn tại nên nó sẽ chỉ được thay thế do đó, tính đơn giản được giữ nguyên vì yêu cầu PUT tiếp theo không có tác dụng phụ mới. (Tất nhiên đó là giả định rằng tôi tiếp tục đặt mục hoàn toàn giống nhau)
Alappin

3

Tôi sẽ đi ra ngoài vào một chi và đoán rằng bạn biết những gì bạn có nghĩa là bộ điều khiển tiêu chuẩn cho MVC là gì khi bạn nói "RESTful" url, vì ví dụ của bạn có thể được coi phi "RESTful" (xem này bài viết).

Vì Rails thực sự phổ biến kiểu URL mà bạn có vẻ quan tâm, tôi cung cấp bên dưới các hành động của bộ điều khiển mặc định được tạo bởi ScaffoldingGenerator trong Ruby on Rails. Những điều này sẽ quen thuộc với bất kỳ ai sử dụng ứng dụng Rails.

Các hành động và chế độ xem được dàn dựng là: lập chỉ mục, danh sách, hiển thị, mới, tạo, chỉnh sửa, cập nhật, hủy

Thông thường, bạn sẽ xây dựng điều này như:

http://application.com/controller/<action>/<id>

5
Các quy ước URI ngoài dải là KHÔNG KHẢ NĂNG PHỤC HỒI. Trích dẫn Fielding: "API REST không được xác định tên tài nguyên cố định hoặc cấu trúc phân cấp (sự kết hợp rõ ràng giữa máy khách và máy chủ). Máy chủ phải có quyền tự do kiểm soát không gian tên của riêng mình. Thay vào đó, hãy cho phép máy chủ hướng dẫn máy khách cách tạo URI thích hợp như được thực hiện dưới các hình thức HTML và URI mẫu, bằng cách định nghĩa những hướng dẫn trong các loại phương tiện truyền thông và quan hệ liên kết .."
aehlke

1

Dưới đây là ánh xạ các URL hiện tại của bạn bằng nguyên tắc REST:

/question/show/<whatever>

Nếu bạn xác định câu hỏi là một tài nguyên, thì câu hỏi đó phải có một URL duy nhất. Sử dụng GET để hiển thị nó (truy xuất nó) là cách phổ biến. No trở nên:

GET /question/<whatever>

/question/edit/<whatever>

Bây giờ bạn muốn người dùng của mình có một dạng xem khác của cùng một tài nguyên cho phép anh ta chỉnh sửa tài nguyên (có thể với các điều khiển biểu mẫu).

Hai tùy chọn ở đây, ứng dụng của bạn là một ứng dụng (không phải trang web), thì tốt hơn bạn có thể sử dụng JavaScript để chuyển đổi tài nguyên thành một tài nguyên có thể chỉnh sửa được ở phía máy khách.

Nếu đây là một trang web, thì bạn có thể sử dụng cùng một URL với thông tin bổ sung để chỉ định một chế độ xem khác, thực tế phổ biến dường như là:

GET /question/<whatever>;edit

/question/update/<whatever> (this is the post back url)

Điều này là để thay đổi câu hỏi, vì vậy PUT là phương pháp chính xác để sử dụng:

PUT /question/<whatever>

/question/list   (lists the questions)

Danh sách câu hỏi thực sự là tài nguyên chính của một câu hỏi, vì vậy nó đương nhiên là:

GET /question

Bây giờ bạn có thể cần thêm một số:

POST /question (create a new question and returns its URL)
DELETE /question/<whatever> (deletes a question if this is relevant)

Tada :)


-1

Bốn ví dụ của bạn có thể là:

GET /questions/123
POST (or PUT) /questions/123 q=What+is+the+meaning+of+life
POST (or PUT) /questions/123 q=What+is+the+meaning+of+life
GET /questions

Để thêm câu hỏi:

POST /questions q=What+is+the+meaning+of+life

Máy chủ sẽ trả lời:

200 OK (or 201 Created)
Location: /questions/456
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.