2009-07-09 37 views
37

Nhìn xung quanh, tôi không thể đặt tên cho một ứng dụng web đơn lẻ (không phải dịch vụ web) sử dụng bất cứ thứ gì ngoài yêu cầu GET và POST. Có lý do cụ thể nào cho điều này không? Một số trình duyệt (hoặc máy chủ) có hỗ trợ bất kỳ loại yêu cầu nào khác không? Hay điều này chỉ vì lý do lịch sử? Tôi muốn sử dụng các yêu cầu PUT và DELETE để làm cho cuộc sống của tôi dễ dàng hơn một chút ở phía máy chủ, nhưng tôi không muốn vì không có ai khác làm.Có lý do gì để không sử dụng HTTP PUT và DELETE trong một ứng dụng web không?

Trả lời

39

Thực tế, một số lượng người dùng khá bằng PUT và DELETE, chủ yếu là cho các API không phải trình duyệt. Một số ví dụ là Atom Publishing Protocol và các API dữ liệu của Google:

Ngoài ra, bạn không thấy PUT/DELETE áp dụng phổ biến bởi vì hầu hết các trình duyệt không hỗ trợ PUT và DELETE thông qua Biểu mẫu. HTML5 dường như được sửa chữa này:

Cách nó hoạt động cho các ứng dụng trình duyệt là: người thiết kế các ứng dụng RESTful với PUT và DELETE trong tâm trí, sau đó "đường hầm" những yêu cầu thông qua các bài viết từ các trình duyệt. Ví dụ, xem câu hỏi này SO về cách Ruby on Rails hoàn thành điều này sử dụng các trường ẩn:

Vì vậy, bạn sẽ không phải là ngày của riêng bạn thiết kế ứng dụng của bạn với các thiết lập lớn hơn của HTTP động từ trong tâm trí.

EDIT: Nhân tiện, nếu bạn tò mò về lý do tại sao PUT/DELETE bị thiếu trong các bài đăng trên biểu mẫu dựa trên trình duyệt, hóa ra không có lý do kỹ thuật thực sự tốt. Đọc xung quanh chủ đề này trên mailing list nghỉ ngơi-thảo luận, đặc biệt là ý kiến ​​Roy Fielding, là thú vị đối với một số bối cảnh:

EDIT: Có một số ý kiến ​​về việc liệu thư viện AJAX hỗ trợ tất cả các phương pháp . Nó đi xuống để thực hiện trình duyệt thực tế của XMLHttpRequest. Tôi nghĩ ai đó có thể tìm thấy liên kết này tiện dụng, kiểm tra trình duyệt của bạn để xem cách đối tượng HttpRequest tuân thủ với các tùy chọn HTTP khác nhau.

Thật không may, tôi không biết một tài liệu tham khảo mà thu thập những kết quả này.

+6

Đoán xem cái gì? trong phiên bản mới nhất (ngày 19 tháng 10 năm 2010) hỗ trợ PUT/DELETE trong HTML5 có vẻ bị xóa. http://www.w3.org/TR/html5/forms.html#form-submission-0 –

+0

@Xie: Thú vị tìm thấy. Có vẻ phản tác dụng với tôi ... –

3

Một số máy chủ proxy có chính sách bảo mật khó khăn có thể xóa chúng. Tôi đang sử dụng PUT và DELETE anyways.

3

Tôi đã đọc rằng một số trình duyệt không hỗ trợ các phương thức HTTP khác đúng cách, mặc dù tôi không thể nêu tên bất kỳ chi tiết cụ thể nào.

Rails, cụ thể, sẽ đóng gói biểu mẫu của bạn với thông số phương pháp để đặt rõ ràng điều này ngay cả khi trình duyệt không hỗ trợ các phương thức đó. Điều đó có vẻ như một biện pháp phòng ngừa hợp lý nếu bạn định làm điều này.

9

Rất đơn giản, các HTML 4.01 form element chỉ cho phép các giá trị "POST" và "GET" trong method thuộc tính của nó

+0

Hmm, điều đó có ý nghĩa ... Nhưng điều này không áp dụng cho các yêu cầu Ajax, đúng không? Tôi có thể sử dụng bất cứ phương pháp nào tôi muốn? –

+0

Nếu trình duyệt được xây dựng theo thông số kỹ thuật HTML 4.01, nó sẽ không hiểu bất cứ điều gì khác với thông số kỹ thuật. Đó là tất cả những gì bạn có thể giả định một trình duyệt có thể làm – Gareth

+3

Các trình duyệt thường được xây dựng với nhiều hơn chỉ là một đặc tả HTML - JavaScript không phải là một phần của HTML 4.01. – aehlke

0

này phụ thuộc vào trình duyệt của bạn và thư viện Ajax. Ví dụ: jQuery hỗ trợ tất cả các phương thức HTTP mặc dù trình duyệt có thể không. Xem ví dụ: jQuery "ajax" documentation trên thuộc tính "loại".

Khung công tác Java Restlet Java cho phép bạn yêu cầu đường dẫn PUT và DELETE thông qua các thao tác HTML POST. Để làm điều này, bạn chỉ cần thêm method = đặt hoặc method = xóa để chuỗi truy vấn URI của bạn, ví dụ:

http://www.example.com/user=xyz?method=delete ... 

Đây là giống như Ruby on Rails cách tiếp cận (như mô tả của @ars ở trên).

+2

Từ tài liệu jQuery: "Các phương thức yêu cầu HTTP khác, chẳng hạn như PUT và DELETE, cũng có thể được sử dụng ở đây, nhưng chúng không được tất cả các trình duyệt hỗ trợ". Vì vậy, bạn sai về điều đó. –

1

Tôi nói sử dụng tất cả các tính năng của HTTP, trình duyệt bị hỏng, lol. Có lẽ nó sẽ truyền cảm hứng cho việc sử dụng giao thức HTTP hoàn chỉnh và thích hợp hơn trong tương lai. Có nhiều điều xảy ra trên mạng hơn là chỉ POST và GET. Giới thiệu về triển khai trình duyệt thời gian đã phản ánh điều này.

+0

Haha, tôi ước Thật không may tôi không nghĩ rằng làm cho ứng dụng web của tôi * không hoạt động * sẽ làm bất cứ điều gì ngoài việc tức giận người dùng của tôi. :) –

+0

hmmm ... vâng, tôi cho rằng bạn có một điểm. ồ, đó là một ý nghĩ hay. – codemonkey

+2

nhưng chờ ... nó hoạt động cho microsoft ... – codemonkey

0

Cá nhân, tôi thực sự không thấy bất kỳ mục đích nào để sử dụng PUT hoặc DELETE trong ứng dụng web. Tất cả các hoạt động mà một ứng dụng thực hiện là đọc hoặc ghi, hay còn gọi là đầu vào đầu vào. Tại sao bạn cần phải phân biệt bản chất của hoạt động trong tiêu đề của yêu cầu HTTP? Tôi có thể thực hiện cuộc gọi ajax với cùng url của biểu mẫu/đối tượng/object_id và thực hiện nhiều thao tác như xóa, cập nhật, nhận giá trị hoặc tạo. Chỉ cần nhìn vào URL, tôi không biết đầu mối nào. Bằng cách sử dụng GET và POST chỉ, url của tôi sẽ là:

/đối tượng/id/xóa

/đối tượng/id/tạo

/đối tượng/id/cập nhật

/đối tượng/id -> ngụ ý GET

v.v.

Dựa trên kinh nghiệm hạn chế của tôi, đây là loại sạch hơn nhiều loại yêu cầu tiêu đề ẩn trong nhiều trường hợp. Tôi không nói người ta không bao giờ nên sử dụng PUT hoặc DELETE, chỉ cần nói, sử dụng chúng chỉ khi thật cần thiết.

Tham khảo "API Web RESTful" của Leonard Richardson để đọc thêm về các ca sử dụng và quy ước khác nhau về phương thức yêu cầu HTTP trong api web RESTful.

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