views:

9878

answers:

8

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 this, that browsers support only GET and POST, from some other sources like:

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?

+2  A: 

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 uses XMLHttpRequest. The browsers do not natively support XMLHttpRequest. 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 support PUT and DELETE—because it's actually JavaScript that is supporting them.

Hank Gay
XMLHttpRequest is a standard object in the JavaScript Object model.
Jacob
+3  A: 

XMLHttpRequest is a standard object in the JavaScript Object model.

It 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 8.0, 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 - including GET, POST, HEAD, PUT and DELETE

Vihung
+17  A: 

Read a indepth analysis here: HTTP methods, Web browsers and XMLHttpRequest

He tested various HTTP Methods with Ajax calls from Fx, Opera and IE.

Andre Bossard
A: 

It's not just the client you need to worry about, lots of server side frameworks only support GET and POST.

derby
+23  A: 

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. XHTML 2.0 will support GET, POST, PUT and DELETE from forms.

However, for the vast majority of RESTful web services GET, POST, PUT and DELETE should be sufficient. All these methods are supported by the implementations of XMLHttpRequest in all the major web browsers (IE, Firefox, Opera).

Matthew Murdoch
"HTML (up to version 4 and XHTML 1)" <- I suppose you meant to say HTTP. Remember: HTML is a file format (such as .exe, .doc or .psd) and HTTP is a protocol for information exchange (such as HTML web pages, images or word .doc files).
No, I definitely mean HTML (I'm talking about HTML forms capabilities although that may not be clear from the text - I'll edit it)
Matthew Murdoch
HTML5 adds support for other methods.
porneL
@Matthew: does this mean that if i use IE6 or IE7, with the following :-<form .. method="PUT" >...</form>it will not work because PUT is not valid for HTML 4?
Pure.Krome
Without trying it I couldn't say for certain. The specification (and the HTML 4 strict and transitional DTDs) only support POST/GET forms. It is quite possible that IE will handle PUT forms which are invalid with respect to the spec (e.g. in an HTML document which doesn't contain a doctype).
Matthew Murdoch
@Pure.Krome (only 14 months later) No, you cannot do <form method="put"> or <form method="delete"> under the HTML 4.01 spec. Only GET and POST are supported by IE8, Chrome3, or FF3.5.
Jarrett Meyer
@porneL Yes, HTML5 allows these methods in forms, but sadly no browser seems to support them yet (two years later).
Alan
+13  A: 

HTML forms support GET and POST. (HTML5 at one point added PUT/DELETE, but those were dropped.)

XMLHttpRequest supports every method, including CHICKEN, though some method names are matched against case-insensitively (methods are case-sensitive per HTTP) and some method names are not supported at all for security reasons (e.g. CONNECT).

Browsers are slowly converging on the rules specified by XMLHttpRequest, but as the other comment pointed out there are still some differences.

Anne
The latest HTML5 draft seems to have dropped PUT and DELETE support: http://dev.w3.org/html5/spec/Overview.html#attr-fs-method
Stefan Tilkov
I fixed the post.
Anne
+3  A: 

Does anyone know if Safari supports PUT and DELETE from an AJAX request? If so, please edit the top answer -- I don't have a Mac or sufficient reputation.

jQuery's documentation on Type says:

The type of request to make ("POST" or "GET"), default is "GET". Note: Other HTTP request methods, such as PUT and DELETE, can also be used here, but they are not supported by all browsers.

It would be nice to clarify that.

Michael Gundlach
+3  A: 

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.

jharlap
Can anyone confirm which version of Safari gained support for PUT and DELETE?
mjs