Các phương thức PUT, DELETE, HEAD, vv có sẵn trong hầu hết các trình duyệt web không?


608

Tôi đã thấy một vài câu hỏi quanh đây như Cách gỡ lỗi các dịch vụ RESTful , trong đó đề cập đến:

Thật không may, cùng một trình duyệt sẽ không cho phép tôi kiểm tra HTTP PUT, DELETE và ở một mức độ nhất định ngay cả HTTP POST.

Tôi cũng đã nghe nói rằng các trình duyệt chỉ hỗ trợ GET và POST, từ một số nguồn khác như:

Tuy nhiên, một vài thử nghiệm nhanh trong Firefox cho thấy việc gửi PUTDELETEyêu cầu hoạt động như mong đợi - XMLHttpRequesthoàn thành thành công và yêu cầu hiển thị trong nhật ký máy chủ với phương thức phù hợp. Có một số khía cạnh cho điều này tôi đang thiếu, chẳng hạn như khả năng tương thích trình duyệt chéo hoặc các hạn chế không rõ ràng?


1
Đó không chỉ là ứng dụng khách bạn cần lo lắng, rất nhiều khung công tác phía máy chủ chỉ hỗ trợ GET và POST.
trận derby

7
John, lý do nào bạn không muốn thẻ REST?
John Saunders

11
Mặc dù những người đọc nó có khả năng đang nghiên cứu API RESTful.
djjeck


Không, tất cả các trình duyệt không hỗ trợ các phương thức PUT / DELETE và cũng không phải tất cả các công nghệ phía máy chủ đều không hỗ trợ PUT / DELETE. Chỉ trình duyệt được hỗ trợ HTML 5 hỗ trợ PUT / DELETE.
Jani Devang

Câu trả lời:


463

Không. Thông số kỹ thuật HTML 5 đề cập:

Các thuộc tính nội dung của phương thức và biểu mẫu là các thuộc tính được liệt kê với các từ khóa và trạng thái sau:

Từ khóa có được , ánh xạ tới trạng thái GET, biểu thị phương thức HTTP GET. Phương thức GET chỉ nên yêu cầu và truy xuất dữ liệu và không có tác dụng nào khác.

Bài viết từ khóa , ánh xạ tới trạng thái POST, chỉ ra phương thức POST HTTP. Phương thức POST yêu cầu máy chủ chấp nhận dữ liệu của biểu mẫu đã gửi để xử lý, điều này có thể dẫn đến một mục được thêm vào cơ sở dữ liệu, tạo tài nguyên trang web mới, cập nhật trang hiện có hoặc tất cả các kết quả được đề cập .

Hộp thoại từ khóa , ánh xạ tới hộp thoại trạng thái, chỉ ra rằng việc gửi biểu mẫu được dự định để đóng hộp thoại trong đó biểu mẫu tìm thấy chính nó, nếu có, và nếu không thì không gửi.

Giá trị mặc định không hợp lệ cho các thuộc tính này là trạng thái GET

Các biểu mẫu HTML chỉ hỗ trợ GETPOST dưới dạng phương thức yêu cầu HTTP. Một cách giải quyết cho vấn đề này là tạo đường hầm cho các phương thức khác thông qua POST bằng cách sử dụng trường biểu mẫu ẩn được đọc bởi máy chủ và yêu cầu được gửi đi tương ứng.

Tuy nhiên, GET , POST , PUTDELETE được hỗ trợ bởi việc triển khai XMLHttpRequest (tức là các cuộc gọi AJAX) trong tất cả các trình duyệt web chính (IE, Firefox, Safari, Chrome, Opera).


170
Không, tôi chắc chắn có nghĩa là HTML (Tôi đang nói về các khả năng của biểu mẫu HTML mặc dù điều đó có thể không rõ ràng từ văn bản - Tôi sẽ chỉnh sửa nó)
Matthew Murdoch

6
@Matthew: điều này có nghĩa là nếu tôi sử dụng IE6 hoặc IE7, với thông tin sau: - <form .. method = "PUT"> ... </ form> nó sẽ không hoạt động vì PUT không hợp lệ cho HTML 4?
Pure.Krom

6
@ Pure.Krom (chỉ 14 tháng sau) Không, bạn không thể thực hiện <form method = "put"> hoặc <form method = "xóa"> trong thông số HTML 4.01. Chỉ GET và POST được hỗ trợ bởi IE8, Chrome3 hoặc FF3.5.
Jarrett Meyer

23
@yheL @Alan HTML5 đã thêm chúng và sau đó xóa chúng. Hiện tại chỉ cho phép GET và POST. goo.gl/8EuZk
Adam

13
@yyeL HTML5 đã thêm chúng và sau đó xóa chúng và bây giờ lỗi được mở lại. Thật thú vị, tôi đã thấy một số tài liệu vẫn còn có chúng trong đó. Đây là lỗi nếu bạn muốn theo dõi tại nhà: w3.org/Bugs/Public/show_orms.cgi?id=10671
Emil Lerch

79

Các hình thức HTML hỗ trợ GET và POST. (HTML5 tại một thời điểm đã thêm PUT / DELETE, nhưng những thứ đó đã bị loại bỏ.)

XMLHttpRequest hỗ trợ mọi phương thức, bao gồm cả CHICKEN, mặc dù một số tên phương thức được khớp với phân biệt chữ hoa chữ thường (các phương thức phân biệt chữ hoa chữ thường trên mỗi HTTP) và một số tên phương thức hoàn toàn không được hỗ trợ vì lý do bảo mật (ví dụ CONNECT).

Các trình duyệt đang dần hội tụ các quy tắc được chỉ định bởi XMLHttpRequest, nhưng như các nhận xét khác đã chỉ ra, vẫn còn một số khác biệt.


5
Bản nháp HTML5 mới nhất dường như đã bỏ hỗ trợ PUT và DELETE: dev.w3.org/html5/spec/Overview.html#attr-fs-method
Stefan Tilkov

3
Một dự thảo đã được đề xuất để lấy lại chúng: amundsen.com/examples/put-delete-forms
Joost Baaij

26
THỊT GÀ? Con chim? Tôi cho rằng bạn có nghĩa là KIỂM TRA. Đó là một hoán đổi nguyên âm vui nhộn.
JayC

52
Không, ý tôi là GÀ, minh họa nó có thể là bất cứ thứ gì bạn thích. Đồng ý về việc hoán đổi nguyên âm là buồn cười :-)
Anne

6
Đối với những người cũng hoang mang như tôi với doanh nghiệp CHICKEN này .... w3c-test.org/XMLHttpRequest/open-method-case-sensitive.htmlm
n0nag0n

43

XMLHttpRequest là một đối tượng tiêu chuẩn trong mô hình Đối tượng JavaScript.

Theo Wikipedia, XMLHttpRequestlần đầu tiên xuất hiện trong Internet Explorer 5 dưới dạng đối tượng ActiveX, nhưng sau đó đã được tạo thành một tiêu chuẩn và đã được đưa vào sử dụng trong JavaScript trong gia đình Mozilla kể từ 1.0, Apple Safari 1.2, Opera 7.60-p1 và IE 7.0 .

Các open()phương pháp trên đối tượng có phương pháp HTTP như một cuộc tranh cãi - và được quy định như khi dùng bất cứ phương thức HTTP hợp lệ (xem mục số 5 của liên kết) - bao gồm GET, POST, HEAD, PUTDELETE, như được xác định bởi RFC 2616 .

Như một lưu ý phụ IE 7 chỉ8 cho phép các phương thức HTTP sau: "GET", "POST", "Head", "PUT", "DELETE", "MOVE", "PROPFIND", "PROPPATCH", "MKCOL" , "SAO CHÉP", "LOCK", "UNLOCK" và "TÙY CHỌN" .


7
Tôi hy vọng sẽ thấy một số tài liệu để đọc thêm, tôi không nói rằng tôi không tin bạn. Các liên kết trên wikipedia thực sự khá tốt đẹp. Cảm ơn
naugtur

19

_method ẩn trường giải pháp

Được sử dụng trong Rails và có thể được điều chỉnh theo bất kỳ khung nào:

  • thêm một _methodtham số ẩn vào bất kỳ dạng nào không phải là GET hoặc POST:

    <input type="hidden" name="_method" value="DELETE">

    Điều này có thể được thực hiện tự động trong các khung thông qua phương thức trình trợ giúp tạo HTML (ví dụ: Rails form_tag)

  • sửa phương thức biểu mẫu thực tế thành POST ( <form method="post")

  • xử lý _methodtrên máy chủ và thực hiện chính xác như thể phương thức đó đã được gửi thay vì POST thực tế

Lý do / lịch sử tại sao không thể: /software/114156/why-there-are-no-put-and-delete-methods-in-html-forms


Santilli, xin chào, đã lâu rồi kể từ khi bạn đưa ra giải pháp này, và vì tôi là người mới bắt đầu phát triển web nên tôi có một câu hỏi mà tôi hy vọng bạn sẽ trả lời. Vì vậy, bạn đã nói rằng "xử lý _method trên máy chủ và thực hiện chính xác như thể phương thức đó đã được gửi thay vì POST thực tế", bạn có nghĩa là nếu phương thức ẩn với PUT (hoặc XÓA) được đưa vào dạng xem, nó thực sự có nghĩa là PUT (hoặc XÓA) yêu cầu phải không? nếu có thì tại sao phải sử dụng phương thức POST tại cầu xin và sau đó sử dụng PUT hoặc XÓA ẩn. Kết nối giữa POST và PUT (hoặc XÓA) là gì :)
Mirich

1
@Mirich mẫu chỉ hỗ trợ POST. Vì vậy, chúng tôi gửi POST với dữ liệu bổ sung, mà máy chủ biết có nghĩa là: ah, tôi nên coi đây là PUT.
Ciro Santilli 郝海东 冠状 病 事件

Cảm ơn Ciro vì sự quan tâm và trả lời của bạn, vì vậy tôi có thể xem xét kịch bản như thế này không: POST là một thứ phổ biến chứa POST, PUT, PATCH và DELETE thực sự bên trong chính nó và nếu bạn sử dụng POST ngay từ đầu mà không bị ẩn thì nó có nghĩa là thực tế BÀI ĐĂNG. Nhưng nếu bạn sử dụng POST với ẩn (PUT hoặc DELETE) thì bạn cho máy chủ biết rằng bạn muốn sử dụng PUT hoặc DELETE bên trong POST như là con của nó bên trong Tôi biết một chút tương tự lạ nhưng điều đó có đúng không? :)
Mirich

1
@Mirich yup, tôi nghĩ bạn đã có ý tưởng.
Ciro Santilli 郝海东 冠状 病 事件

xin lỗi Ciro chỉ là điều cuối cùng, tôi tự hỏi tại sao PUT và DELETE bị xóa khỏi HTML5 vì sẽ không tốt hơn nếu bạn chỉ có thể sử dụng PUT hoặc DELETE khi bắt đầu thẻ biểu mẫu và chỉ không sử dụng ẩn. Xin vui lòng bạn có thể giải thích ngắn gọn và rõ ràng lý do thực sự của việc loại bỏ PUT và XÓA. Cảm ơn bạn trước :)
Mirich

15

Tôi tin rằng những nhận xét đó đề cập cụ thể đến các trình duyệt, tức là nhấp vào liên kết và gửi biểu mẫu, không phải XMLHttpRequest . XMLHttpRequestchỉ là một ứng dụng khách tùy chỉnh mà bạn đã viết bằng JavaScript sử dụng trình duyệt làm thời gian chạy.

CẬP NHẬT: Để làm rõ, tôi không có ý (mặc dù tôi đã viết) mà bạn đã viết XMLHttpRequest; Tôi có nghĩa là bạn đã viết mã sử dụng XMLHttpRequest. Các trình duyệt không hỗ trợ XMLHttpRequest. XMLHttpRequestxuất phát từ thời gian chạy JavaScript, có thể được lưu trữ bởi một trình duyệt, mặc dù không bắt buộc phải có (xem Rhino ). Đó là lý do tại sao mọi người nói rằng các trình duyệt không hỗ trợ PUTDELETEvì đó thực sự là JavaScript hỗ trợ họ.


XMLHttpRequest là một đối tượng tiêu chuẩn trong mô hình Đối tượng JavaScript.
Jacob Krall

9
@Jacob Đúng, nhưng các trình duyệt khác nhau có các công cụ JavaScript khác nhau. Biết những cái nào hỗ trợ PUT vẫn hữu ích.
senfo

1
it's actually JavaScript that is supporting them. Không thực sự đúng. XMLHttpRequestlà một 'đối tượng máy chủ', nghĩa là nó là một đối tượng thể hiện chức năng từ máy chủ thành mã Javascript. Bản thân nó không phải là một phần của JS.
Stijn de Witt

9

ĐÚNG phương thức HTTP , PUT, DELETE, HEAD, vv có sẵn trong tất cả các trình duyệt hiện đại.

Để được tuân thủ với các trình duyệt cấp 2 của XMLHttpRequest phải hỗ trợ các phương thức này. Để kiểm tra trình duyệt nào hỗ trợ XMLHttpRequest Cấp 2, tôi khuyên dùng CanIUse:

http://caniuse.com/#feat=xhr2

Chỉ Opera Mini là thiếu hỗ trợ atm (juli '15), nhưng Opera Mini thiếu hỗ trợ cho mọi thứ. :)


7

Chỉ cần thêm - Safari 2 trở về trước chắc chắn không hỗ trợ PUT và DELETE. Tôi có ấn tượng 3 đã làm, nhưng tôi không có nó để kiểm tra nữa. Safari 4 chắc chắn không hỗ trợ PUT và DELETE.


5
Bất cứ ai cũng có thể xác nhận phiên bản Safari nào đã nhận được hỗ trợ cho PUT và DELETE?
mjs

1
Bất cứ ai cũng có thể giải thích nếu tất cả các trình duyệt NGAY hỗ trợ PUT & DELETE - và khoảng thời gian này đã có sẵn. Lưu ý về ví dụ "CHICKEN", điều này có nghĩa là hoàn toàn tùy thuộc vào máy chủ để giải thích phương thức nào được sử dụng VÀ JavaScript không hạn chế loại phương thức ...?
Cody
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.