Çoğu web tarayıcısında PUT, DELETE, HEAD vb. Yöntemler kullanılabilir mi?


608

Burada RESTful hizmetlerinde hata ayıklama gibi birkaç soru gördüm :

Ne yazık ki aynı tarayıcı HTTP PUT, DELETE ve hatta belirli bir dereceye kadar HTTP POST'u test etmeme izin vermiyor.

Ayrıca, tarayıcıların aşağıdaki gibi diğer kaynaklardan yalnızca GET ve POST'u desteklediğini duydum:

Ancak, Firefox'ta yapılan birkaç hızlı test, gönderme PUTve DELETEisteklerin beklendiği gibi çalıştığını XMLHttpRequestgösterir - başarıyla tamamlanır ve istek sunucuda doğru yöntemle görünür. Çapraz tarayıcı uyumluluğu veya açık olmayan sınırlamalar gibi eksik olduğum bir yönü var mı?


1
Sadece endişelenmeniz gereken istemci değil, birçok sunucu tarafı çerçevesi sadece GET ve POST'u destekliyor.
derby

7
John, REST etiketini istememenin bir nedeni var mý?
John Saunders

11
Her ne kadar bunu okuyan kişilerin RESTful API'leri araştırması muhtemeldir.
djjeck


Hayır, tüm tarayıcılar PUT / DELETE yöntemlerini desteklemez ve ayrıca sunucu tarafı teknolojilerinin tümü PUT / DELETE'i desteklemez. Yalnızca HTML 5 destekli tarayıcı PUT / DELETE'i destekler.
Jani Devang

Yanıtlar:


463

Hayır. HTML 5 spesifikasyonları :

Yöntem ve formethod içerik özellikleri, aşağıdaki anahtar kelimeler ve durumlarla numaralandırılmış özelliklerdir:

ANAHTAR KELİME olsun , HTTP GET yöntemini gösteren devlet GET için, eşleştirmesini. GET yöntemi yalnızca veri istemeli ve almalı ve başka bir etkisi olmamalıdır.

HTTP POST yöntemini belirten POST durumuna eşlenen posta anahtar kelimesi . POST yöntemi, sunucunun gönderilen formun işlenmesini kabul etmesini ister; bu, bir öğenin veritabanına eklenmesi, yeni bir web sayfası kaynağı oluşturulması, mevcut sayfanın güncellenmesi veya belirtilen sonuçların tümü ile sonuçlanabilir. .

Durum iletişim kutusuyla eşlenen anahtar kelime iletişim kutusu, formun gönderilmesinin, formun kendisini bulduğu ve yoksa göndermediği iletişim kutusunu kapatmayı amaçladığını belirtir.

Bu özellikler için varsayılan geçersiz değer GET durumudur

Yani HTML formları HTTP istek yöntemleri olarak yalnızca GET ve POST'u destekler . Bunun bir çözümü, sunucu tarafından okunan gizli bir form alanı ve buna göre gönderilen istek kullanılarak POST aracılığıyla diğer yöntemleri tünellemektir.

Ancak, GET , POST , PUT ve DELETE , tüm büyük web tarayıcılarında (IE, Firefox, Safari, Chrome, Opera) XMLHttpRequest (yani AJAX çağrıları) uygulamaları tarafından desteklenir.


170
Hayır, kesinlikle HTML'yi kastediyorum (HTML formlarının yeteneklerinden bahsediyorum, ancak metinden net olmayabilir - düzenleyeceğim)
Matthew Murdoch

6
@Matthew: Bu, IE6 veya IE7'yi aşağıdakilerle kullanırsam şu anlama gelir: - <form .. method = "PUT"> ... </form> PUT HTML 4 için geçerli olmadığı için çalışmayacak mı?
Pure.Krome

6
@ Pure.Krome (yalnızca 14 ay sonra) Hayır, HTML 4.01 spesifikasyonu altında <form method = "put"> veya <form method = "delete"> yapamazsınız. IE8, Chrome3 veya FF3.5 tarafından yalnızca GET ve POST desteklenir.
Jarrett Meyer

23
@porneL @Alan HTML5 bunları ekledi ve ardından kaldırdı. Şu anda yalnızca GET ve POST işlemlerine izin verilmektedir. goo.gl/8EuZk
Adam Lassek

13
@porneL HTML5 onları ekledi ve sonra kaldırdı ve şimdi hata yeniden açıldı. İlginçtir, hala orada olan bazı belgeler gördüm. İşte evde takip etmek istiyorsanız hata: w3.org/Bugs/Public/show_bug.cgi?id=10671
Emil Lerch

79

HTML formları GET ve POST'u destekler. (Bir noktada HTML5 PUT / DELETE ekledi, ancak bunlar düştü.)

XMLHttpRequest, CHICKEN dahil her yöntemi destekler, ancak bazı yöntem adları büyük / küçük harfe duyarsız olarak eşleştirilir (yöntemler HTTP başına büyük / küçük harfe duyarlıdır) ve bazı yöntem adları güvenlik nedeniyle hiç desteklenmez (örn. CONNECT).

Tarayıcılar, XMLHttpRequest tarafından belirtilen kurallara yavaşça yaklaşıyor, ancak diğer yorumun işaret ettiği gibi, hala bazı farklılıklar var.


5
En son HTML5 taslağı PUT ve DELETE desteğini düşürmüş gibi görünüyor: dev.w3.org/html5/spec/Overview.html#attr-fs-method
Stefan Tilkov

3
Onları geri almak için bir taslak önerildi: amundsen.com/examples/put-delete-forms
Joost Baaij

26
TAVUK? Kuş? Sanırım CHECKIN demek istiyorsun. Bu komik bir sesli harf takası.
JayC

52
Hayır CHICKEN'i kastetmiştim. Ünlü sesli takas komik olsa da kabul etti :-)
Anne

6
Bu TAVUK işinde olduğum kadar şaşkın olanlar için .... w3c-test.org/XMLHttpRequest/open-method-case-sensitive.htm
n0nag0n 31:16

43

XMLHttpRequest JavaScript Nesne modelindeki standart bir nesnedir.

Wikipedia'ya göre, XMLHttpRequestilk olarak Internet Explorer 5'de bir ActiveX nesnesi olarak ortaya çıktı, ancak o zamandan beri bir standart haline getirildi ve 1.0, Apple Safari 1.2, Opera 7.60-p1 ve IE 7.0'dan beri Mozilla ailesindeki JavaScript'te kullanım için dahil edildi .

open()Yöntem nesne üzerinde bağımsız değişken olarak HTTP Yöntem alır - ve herhangi bir geçerli bir HTTP yöntemi (bağlantının madde numarası 5 bakınız) aldığı belirtilse - dahil GET, POST, HEAD, PUTve DELETEgibi RFC 2616 tarafından belirtilen .

Yan not olarak IE 7-8 yalnızca şu HTTP yöntemlerine izin verir: "GET", "POST", "HEAD", "PUT", "DELETE", "MOVE", "PROPFIND", "PROPPATCH", "MKCOL" , "KOPYA", "KİLİT", "KİLİDİ ​​AÇ" ve "SEÇENEKLER" .


7
Daha fazla okumak için bazı belgeler görmeyi umuyordum, sana inanmadığımı söylemiyorum. Vikipedi üzerindeki bağlantılar aslında oldukça güzel. Teşekkürler
naugtur

19

_method gizli alan geçici çözümü

Raylarda kullanılır ve herhangi bir çerçeveye uyarlanabilir:

  • _methodGET veya POST olmayan herhangi bir forma gizli bir parametre ekleyin :

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

    Bu, HTML oluşturma yardımcı yöntemi (örn. Rails form_tag) aracılığıyla çerçevelerde otomatik olarak yapılabilir

  • gerçek form yöntemini POST ( <form method="post") olarak düzeltin

  • _methodsunucudaki işlemleri ve gerçek POST yerine bu yöntem gönderilmiş gibi yapın

Gerekçe / neden mümkün olmadığının tarihi: /software/114156/why-there-are-no-put-and-delete-methods-in-html-forms


Santilli, merhaba dostum bu çözümü sunduğunuzdan beri uzun zaman oldu ve web geliştirmeye yeni başladığımdan beri cevaplayacağınızı umduğum bir sorum var. Yani, "sunucudaki _method'u işler ve gerçek POST yerine tam olarak bu yöntem gönderilmiş gibi yaparsınız" demiştiniz, yani PUT (veya DELETE) ile gizli yöntem görünümüne koyulursa aslında PUT anlamına gelir (veya SİL) isteği doğru mu? evet ise, başlangıçta POST yöntemini neden kullanmalı ve sonra gizli PUT veya DELETE kullanmalısınız. POST ve PUT (veya DELETE) :) arasındaki bağlantı nedir
Mirich

1
@Mirich yalnızca POST'u destekler. Bu yüzden sunucunun bildiği ekstra verilerle POST göndeririz: ah, buna bir PUT gibi davranmalıyım.
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

İlginiz ve cevabınız için Ciro'ya teşekkür ederim, bu senaryoyu şöyle düşünebilir miyim: POST, kendi içinde gerçek POST, PUT, PATCH ve DELETE'i tutan evrensel bir şeydir ve POST'u gizli olmadan kullanırsanız, gerçek İLETİ. Ancak POST'u gizli (PUT veya DELETE) ile kullanırsanız, sunucuya POST içindeki PUT veya DELETE'i kullanmak istediğinizi bilmenizi sağlarsınız. İçindeki çocuklar biraz garip benzetmeyi biliyor ama doğru mu? :)
Mirich

1
@Mirich yup, sanırım fikri anladın.
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

üzgünüm Ciro sadece son şey, PUT ve DELETE neden HTML5 kaldırıldı merak ediyorum çünkü sadece form etiketinin başında PUT veya DELETE kullanabilirsiniz ve sadece gizli kullanamazsanız daha iyi olmazdı. Lütfen PUT ve DELETE kaldırılmasının gerçek nedenini kısaca ve açık bir şekilde açıklayabilir misiniz? Şimdiden teşekkür ederim :)
Mirich

15

Bu yorumların özellikle tarayıcılara atıfta bulunduğuna inanıyorum, yani, bağlantıları tıklayıp form göndermek değil XMLHttpRequest. XMLHttpRequestbu sadece bir özel istemci olan sen bir çalışma zamanı olarak tarayıcı kullanan JavaScript yazdı.

GÜNCELLEME: ki (ben yazma gerçi) ben istemedim netleştirmek için size yazdım XMLHttpRequest; Demek istediğim, kullandığınız kodu yazdınız XMLHttpRequest. Tarayıcılar yerel olarak desteklenmez XMLHttpRequest. XMLHttpRequestolması gerekmese de tarayıcı tarafından barındırılabilen JavaScript çalışma zamanından gelir ( Rhino'ya bakın ). İnsanlar tarayıcılar desteklemez demesinin nedeni budur PUTve DELETEaslında onları destekleyen JavaScript var -çünkü.


XMLHttpRequest, JavaScript Nesne modelindeki standart bir nesnedir.
Jacob Krall

9
@Jacob Doğru, ancak farklı tarayıcıların farklı JavaScript motorları vardır. Hangilerinin PUT'u desteklediğini bilmek hala yararlıdır.
senfo

1
it's actually JavaScript that is supporting them. Gerçekten doğru değil. XMLHttpRequest"host-object", yani anasistemden Javascript koduna işlevsellik gösteren bir nesnedir. JS'nin bir parçası değil.
Stijn de Witt

9

EVET , PUT, DELETE, HEAD vb HTTP yöntemleri tüm modern tarayıcılarda kullanılabilir.

XMLHttpRequest Düzey 2 tarayıcılarıyla uyumlu olması için tarayıcıların bu yöntemleri desteklemesi gerekir . Hangi tarayıcıların XMLHttpRequest Düzey 2'yi desteklediğini kontrol etmek için CanIUse'u öneririm:

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

Sadece Opera Mini'nin destek atm'si yok (juli '15), ancak Opera Mini'nin her şey için desteği yok. :)


7

Sadece eklemek için - Safari 2 ve öncesi kesinlikle PUT ve DELETE'i desteklemedi. 3 izlenimi edindim, ama artık test etmek için etrafımda yok. Safari 4 kesinlikle PUT ve DELETE'i destekliyor.


5
Herkes Safari'nin hangi sürümünün PUT ve DELETE için destek kazandığını doğrulayabilir mi?
mjs

1
Tüm tarayıcılar ŞİMDİ PUT & DELETE'i destekliyorsa - ve bunun ne kadar süredir mevcut olduğunu herkes anlatabilir. "TAVUK" örneğine dikkat etmek, hangi yöntemin kullanıldığını yorumlamak için tamamen sunucuya bağlı olduğu ve JavaScript'in yöntem türünü kısıtlamadığı anlamına mı geliyor?
Cody
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.