I've seen a couple questions around here like How to debug RESTful services, which mentions:
Unfortunately that same browser won't allow me to test HTTP PUT, DELETE, and to a certain degree even HTTP POST.
I've also heard that browsers support only GET and POST, from some other sources like:
- http://www.packetizer.com/ws/rest.html
- http://www.mail-archive.com/jmeter-user@jakarta.apache.org/msg13518.html
- http://www.xml.com/cs/user/view/cs_msg/1098
However, a few quick tests in Firefox show that sending PUT
and DELETE
requests works as expected -- the XMLHttpRequest
completes successfully, and the request shows up in the server logs with the right method. Is there some aspect to this I'm missing, such as cross-browser compatibility or non-obvious limitations?
YES, PUT, DELETE, HEAD etc HTTP methods are available in all modern browsers.
To be compliant with XMLHttpRequest Level 2 browsers must support these methods. To check which browsers support XMLHttpRequest Level 2 I recommend CanIUse:
http://caniuse.com/#feat=xhr2
Only Opera Mini is lacking support atm (juli '15), but Opera Mini lacks support for everything. :)
XMLHttpRequest
is a standard object in the JavaScript Object model.According to Wikipedia,
XMLHttpRequest
first appeared in Internet Explorer 5 as an ActiveX object, but has since been made into a standard and has been included for use in JavaScript in the Mozilla family since 1.0, Apple Safari 1.2, Opera 7.60-p1, and IE 7.0.The
open()
method on the object takes the HTTP Method as an argument - and is specified as taking any valid HTTP method (see the item number 5 of the link) - includingGET
,POST
,HEAD
,PUT
andDELETE
, as specified by RFC 2616.As a side note IE 7–8 only permit the following HTTP methods: "GET", "POST", "HEAD", "PUT", "DELETE", "MOVE", "PROPFIND", "PROPPATCH", "MKCOL", "COPY", "LOCK", "UNLOCK", and "OPTIONS".
_method
hidden field workaroundUsed in Rails and could be adapted to any framework:
add a hidden
_method
parameter to any form that is not GET or POST:This can be done automatically in frameworks through the HTML creation helper method (e.g. Rails
form_tag
)fix the actual form method to POST (
<form method="post"
)processes
_method
on the server and do exactly as if that method had been sent instead of the actual POSTRationale / history of why it is not possible: https://softwareengineering.stackexchange.com/questions/114156/why-there-are-no-put-and-delete-methods-in-html-forms
HTML forms (up to HTML version 4 and XHTML 1) only support GET and POST as HTTP request methods. A workaround for this is to tunnel other methods through POST by using a hidden form field which is read by the server and the request dispatched accordingly.
However, GET, POST, PUT and DELETE are supported by the implementations of XMLHttpRequest (i.e. AJAX calls) in all the major web browsers (IE, Firefox, Safari, Chrome, Opera).
I believe those comments refer specifically to the browsers, i.e., clicking links and submitting forms, not
XMLHttpRequest
.XMLHttpRequest
is just a custom client that you wrote in JavaScript that uses the browser as a runtime.UPDATE: To clarify, I did not mean (though I did write) that you wrote
XMLHttpRequest
; I meant that you wrote the code that usesXMLHttpRequest
. The browsers do not natively supportXMLHttpRequest
.XMLHttpRequest
comes from the JavaScript runtime, which may be hosted by a browser, although it isn't required to be (see Rhino). That's why people say browsers don't supportPUT
andDELETE
—because it's actually JavaScript that is supporting them.Just to add - Safari 2 and earlier definitely didn't support PUT and DELETE. I get the impression 3 did, but I don't have it around to test anymore. Safari 4 definitely does support PUT and DELETE.