Toplayabildiğim kadarıyla üç kategori var:
- Asla kullanma
GET
ve kullanmaPOST
- Asla kullanma
POST
ve kullanmaGET
- Hangisini kullandığınız önemli değil.
Bu üç vakayı varsayar mıyım? Eğer öyleyse, her vakadan bazı örnekler nelerdir?
Toplayabildiğim kadarıyla üç kategori var:
GET
ve kullanmaPOST
POST
ve kullanmaGET
Bu üç vakayı varsayar mıyım? Eğer öyleyse, her vakadan bazı örnekler nelerdir?
Yanıtlar:
Tarayıcınızın adres çubuğundaki POST
bir POST
eyleme erişemediğiniz için oluşturma (ironiyi biliyorum), düzenleme ve silme gibi yıkıcı eylemler için kullanın . GET
Bir kişinin bir eylemi çağırmasına izin vermek güvenli olduğunda kullanın . Yani şöyle bir URL:
http://myblog.org/admin/posts/delete/357
Öğeyi silmek yerine sizi bir onay sayfasına götürmelidir. Kazaları bu şekilde önlemek çok daha kolay.
POST
GET
bir URL'ye bilgi yapıştırmamanızdan da daha güvenlidir . Bu nedenle , bir şifre veya diğer hassas bilgileri toplayan bir HTML formu GET
için method
for kullanmak en iyi fikir değildir.
Son bir not: POST
daha büyük miktarda bilgi iletebilir GET
. 'POST' iletilen veriler için herhangi bir boyut kısıtlamasına sahip değildir, 'GET' ise 2048 karakterle sınırlıdır.
Kısaca
GET
için kullanınsafe and
idempotent
POST
için kullanınneither safe nor idempotent
Ayrıntılarda Her biri için uygun bir yer var. RESTful prensiplerine uymasanız bile , REST ve kaynak odaklı bir yaklaşımın nasıl işlediği hakkında çok şey öğrenilebilir.
Her
use GETs
ikisi de operasyonlar için RESTful bir uygulama olacaktırsafe and idempotent
.
Bir safe
operasyon etmeyen bir işlemdir not change the data
istedi.
Bir idempotent
operasyon sonucu alacağı biridir be the same
istediğinzde kaç kez önemli.
GET'ler güvenli operasyonlar için kullanıldıklarından , otomatik olarak aynı zamanda idempotent olmalarının da mantıklıdır . Tipik olarak bir GET, bir kaynağı (örneğin bir soru ve bunun yığın taşmasıyla ilgili cevapları) veya kaynakların toplanması için kullanılır.
RESTful bir uygulama
PUTs
olan işlemler için kullanacaktırnot safe but idempotent
.
Sorunun GET ve POST ile ilgili olduğunu biliyorum, ancak bir saniyede POST'a döneceğim.
Genellikle bir PUT bir kaynağı düzenlemek için kullanılır (örneğin, yığın taşmasıyla ilgili bir soru veya cevap düzenleme).
A
POST
olan herhangi bir işlem için kullanılırneither safe or idempotent
.
Tipik olarak bir POST, örneğin yeni bir SO sorusu oluşturmak için yeni bir kaynak oluşturmak için kullanılır (ancak bazı tasarımlarda bunun için bir PUT da kullanılır).
POST'u iki kez çalıştırırsanız, iki yeni soru oluşturacaksınız.
Ayrıca bir DELETE işlemi var, ama bunu orada bırakabileceğimi tahmin ediyorum :)
Tartışma
Pratik terimlerle modern web tarayıcıları genellikle GET ve POST'u güvenilir bir şekilde destekler (tüm bu işlemleri javascript aramalarıyla gerçekleştirebilirsiniz, ancak formlara veri girme ve gönder'e basma konusunda genellikle iki seçeneğiniz vardır). RESTful uygulamasında POST genellikle PUT ve DELETE çağrılarını sağlamak için geçersiz kılınır.
Ancak, RESTful ilkelerini izlemeseniz bile, bilgileri almak / görüntülemek için GET'i ve bilgi oluşturmak / düzenlemek için POST'u düşünmek yararlı olabilir.
Verileri değiştiren bir işlem için GET'i asla kullanmamalısınız. Bir arama motoru kötü operasyonunuza veya müşteri yer işaretlerine bir bağlantı tararsa, büyük sorunlara yol açabilir.
Tekrarlanan isteğin bir sakıncası yoksa GET işlevini kullanın (Durum değiştirmez).
İşlem sistemin durumunu değiştirirse POST'u kullanın.
method
zorunlu hale getirme )
GET: Genellikle gönderilen arama istekleri veya kullanıcının tam sayfayı tekrar alabilmesini istediğiniz herhangi bir istek için kullanılır.
GET'in avantajları:
GET'in dezavantajları:
POST: Veritabanını değiştirmek veya başkalarının yer işareti koymasını istemediğiniz bir sayfanın kullanılabileceği daha yüksek güvenlik istekleri için kullanılır.
POST'un Avantajları:
POST'un dezavantajları:
Doğrudan Köprü Metni Aktarım Protokolü'nden - HTTP / 1.1 :
9.3 ALIN
GET yöntemi, İstek-URI'si tarafından tanımlanan herhangi bir bilgiyi (varlık biçiminde) almak anlamına gelir. İstek URI'sı bir veri üretme sürecine atıfta bulunursa, bu metin sürecin çıktısı olmazsa, sürecin kaynak metni olarak değil yanıtta varlık olarak döndürülecek olan üretilen verilerdir.
İstek iletisi bir If-Modified-Since, If-Mododified-Since, If-Match, If-None-Match veya If-Range üstbilgisi alanı içeriyorsa, GET yönteminin semantiği "koşullu GET" olarak değişir. Koşullu bir GET yöntemi, kuruluşun yalnızca koşullu başlık alanları tarafından tanımlanan koşullar altında aktarılmasını ister. Koşullu GET yöntemi, önbelleğe alınan varlıkların birden fazla istek gerekmeden veya istemci tarafından zaten tutulan verileri aktarmadan yenilenmesine izin vererek gereksiz ağ kullanımını azaltmayı amaçlamaktadır.
İstek iletisi bir Aralık üstbilgisi alanı içeriyorsa, GET yönteminin anlam bilgisi "kısmi GET" olarak değişir. Kısmi bir GET, bölüm 14.35'te açıklandığı gibi, işletmenin sadece bir kısmının aktarılmasını talep eder. Kısmi GET yönteminin, kısmen alınan varlıkların zaten istemci tarafından tutulan veriler aktarılmadan tamamlanmasına izin vererek gereksiz ağ kullanımını azaltması amaçlanmıştır.
Bir GET isteğine yanıt, yalnızca ve yalnızca 13. bölümde açıklanan HTTP önbelleğe alma gereksinimlerini karşılıyorsa önbelleğe alınabilir.
Formlar için kullanıldığında güvenlikle ilgili konular için bkz. Bölüm 15.1.3.
9.5 SONRASI
POST yöntemi, kaynak sunucunun, istekte yer alan varlığı İstek Satırında İstek-URI'si tarafından tanımlanan kaynağın yeni bir alt öğesi olarak kabul etmesini istemek için kullanılır. POST, aşağıdaki işlevleri kapsayan tek tip bir yönteme izin verecek şekilde tasarlanmıştır:
Mevcut kaynaklara ek açıklama;
Bülten tahtasına, haber grubuna, posta listesine veya benzer bir makale grubuna mesaj gönderme;
Veri işleme sürecine bir form göndermenin sonucu gibi bir veri bloğunun sağlanması;
Veritabanını ekleme işlemi ile genişletme.
POST yöntemi tarafından gerçekleştirilen gerçek işlev sunucu tarafından belirlenir ve genellikle İstek URI'sına bağlıdır. Gönderilen varlık, bir dosyanın kendisini içeren bir dizine tabi olduğu şekilde bu URI'ye bağlıdır, bir haber makalesi gönderildiği bir haber grubuna veya bir kayıt bir veritabanına bağlıdır.
POST yöntemi tarafından gerçekleştirilen eylem, bir URI tarafından tanımlanabilecek bir kaynakla sonuçlanmayabilir. Bu durumda, yanıtın sonucu tanımlayan bir varlık içerip içermediğine bağlı olarak, 200 (Tamam) veya 204 (İçerik Yok) uygun yanıt durumudur.
İlk önemli şey, GET'in POST'a karşı anlamıdır :
Bundan sonra, dikkat edilmesi gereken birkaç şey:
Her neyse, GET olmadan "yaşayabileceğimizi sanmıyorum: sorgu dizesindeki parametrelerle kaç URL kullandığınızı düşünün, her gün - GET olmadan, bunlar işe yaramaz ;-)
http://example.com/var1/value1/var2/value2/var3/value3
'teknik olarak' artık GET'iniz olamazdı ...
www.mypage.com/contact/
kullanımlar gibi bir şey için dahili olsunindex.php?url=/contact/
Birçok web tarayıcısında uzunluk kısıtlaması farkının yanı sıra, anlamsal bir fark da vardır. GET'lerin sunucu durumunu değiştirmeyen salt okunur işlemler olmaları nedeniyle "güvenli" olmaları gerekir. POST'lar tipik olarak durumu değiştirir ve yeniden gönderimle ilgili uyarılar verir. Arama motorlarının web tarayıcıları GET yapabilir, ancak POST yapmamalıdır.
Durumu değiştirmeden verileri okumak istiyorsanız GET'i ve sunucudaki durumu güncellemek istiyorsanız POST'u kullanın.
Pratik bir fark, tarayıcıların ve web sunucularının bir URL'de bulunabilecek karakter sayısı sınırlaması olmasıdır. Uygulamadan uygulamaya farklıdır, ancak varsa vurmak kesinlikle mümkündürtextarea
formlarınızda .
GET'lerle başka bir gotcha - arama motorları ve diğer otomatik sistemler tarafından endekslenirler. Google bir keresinde, görüntülemekte olduğunuz sayfadaki bağlantıları önceden getirecek bir ürüne sahipti, bu nedenle bu bağlantıları tıklarsanız daha hızlı yüklenirler. İnsanların tüm sitelerini kaybettiği gibi bağlantıları olan sitelerde büyük tahribatlara neden oldu delete.php?id=1
.
URL'nin sayfanın durumunu yansıtmasını istediğinizde GET işlevini kullanın. Bu, burada görülenler gibi dinamik olarak oluşturulan sayfaları görüntülemek için kullanışlıdır. "Yanıtınızı Gönderin" düğmesini tıkladığımda olduğu gibi, veri göndermek için POST formunda kullanılmalıdır. Ayrıca, yoldan sonra bir parametre dizesi oluşturmadığından daha temiz bir URL üretir.
GET'ler yalnızca URL'ler olduğundan, web tarayıcısı tarafından önbelleğe alınabilir ve tutarlı bir şekilde oluşturulan resimler gibi şeyler için daha iyi kullanılabilir. (Bir Sona Erme süresi ayarlayın)
Gravatar sayfasından bir örnek: http://www.gravatar.com/avatar/4c3be63a4c2f539b013787725dfce802?d=monsterid
GET, marjinal olarak daha iyi performans gösterebilir, bazı web sunucuları işleyiciyi çağırmadan önce geçici bir dosyaya POST içeriği yazar.
Dikkate alınması gereken başka bir şey boyut sınırıdır. GET'ler URL'nin boyutuyla, standart olarak 1024 baytla sınırlıdır, ancak tarayıcılar daha fazlasını destekleyebilir.
Daha fazla veri aktarımı daha iyi tarayıcı uyumluluğu elde etmek için POST kullanmalıdır.
Bu sınırın altında bile bir sorun var, başka bir posterin yazdığı gibi, URL'deki herhangi bir şey geçmiş gibi tarayıcı arayüzünün diğer bölümlerinde ortaya çıkabilir.
Kendi başınıza yapamayacağınız bir şey yok. Nokta değiliz ki sözde bir HTTP GET sunucu durumunu değiştirmek için. HTTP proxy'leri, HTTP GET'in durumunu değiştirmediğinden, kullanıcının HTTP GET'i bir kez mi yoksa 1000 kez mi çağırdığını farketmediğini varsayar. Bu bilgileri kullanarak, ilk HTTP GET'in önbelleğe alınmış bir sürümünü döndürmenin güvenli olduğunu varsayarlar. HTTP spesifikasyonunu ihlal ederseniz, HTTP istemcisini ve vekil sunucuları kırma riskiniz vardır. Yapma :)
Bu, REST kavramına ve ağın nasıl kullanılmaya yönelik olduğuna bakmaktadır. Mükemmel bir podcast varYazılım Mühendisliği radyosunda Get ve Post kullanımı hakkında derinlemesine konuşma var.
Get, güncelleme işlemine gerek duyulmaması gereken verileri sunucudan almak için kullanılır. Buradaki fikir, aynı GET isteğini tekrar tekrar kullanabilmeniz ve aynı bilgileri iade edebilmenizdir. URL, sorgu dizesinde bilgi alma özelliğine sahiptir, çünkü diğer sistemlere ve kişilere kolayca bir şeyler bulabilecekleri bir adres gibi gönderilebilmesi amaçlanmıştır.
Postanın, sunucuya bilgi aktarmak / sunucuya bir eylem gerçekleştirmesini bildirmek için (en azından web'in temel aldığı REST mimarisi tarafından) kullanılması gerekiyordu. Örneğin: Bu verileri güncelleyin, Bu kaydı oluşturun.
1.3 HTTP Seçimi için Hızlı Kontrol Listesi GET
veyaPOST
The interaction is more like a question (i.e., it is a safe operation such as a query, read operation, or lookup).
The interaction is more like an order, or
The interaction changes the state of the resource in a way that the user would perceive (e.g., a subscription to a service), or
The user be held accountable for the results of the interaction.
Kaynak .
get olsa kullanarak bir sorun görmüyorum, ben sorgu dizesi şeyler tutmak mantıklı basit şeyler için kullanın.
Durumu güncellemek için kullanmak - delete.php?id=5
bir sayfayı silmek gibi bir GET gibi - çok risklidir. İnsanlar, Google'ın web hızlandırıcısının sayfalardaki URL'leri önceden getirmeye başladığında tüm 'sil' bağlantılarına çarptığını ve insanların verilerini sildiğini öğrendi. Arama motoru örümceklerinde de aynı şey olabilir.
POST büyük verileri hareket ettirirken GET hareket edemez.
Ancak genellikle web sitenizin / web uygulamanızın güzel davranmasını istiyorsanız, GET'in kısa bir süresi değil, bir konvansiyonla ilgilidir.
Http://www.w3.org/2001/tag/doc/whenToUseGet.html adresine bir göz atın
Gönderen RFC 2616 :
9.3 GET
GET yöntemi, İstek-URI'si tarafından tanımlanan herhangi bir bilgiyi (bir varlık şeklinde) almak anlamına gelir. İstek URI'sı bir veri üretme sürecine atıfta bulunursa, bu metin sürecin çıktısı olmazsa, sürecin kaynak metni olarak değil yanıtta varlık olarak döndürülecek olan üretilen verilerdir.
9.5 POST
POST yöntemi, kaynak sunucunun, istekte yer alan varlığı İstek Satırında İstek-URI'si tarafından tanımlanan kaynağın yeni bir alt öğesi olarak kabul etmesini istemek için kullanılır. POST, aşağıdaki işlevleri kapsayan tek tip bir yönteme izin verecek şekilde tasarlanmıştır:
- Mevcut kaynaklara ek açıklama;
- Bülten tahtasına, haber grubuna, posta listesine veya benzer bir makale grubuna mesaj gönderme;
- Veri işleme sürecine bir form göndermenin sonucu gibi bir veri bloğunun sağlanması;
- Veritabanını ekleme işlemi ile genişletme.
POST yöntemi tarafından gerçekleştirilen gerçek işlev sunucu tarafından belirlenir ve genellikle İstek URI'sına bağlıdır. Gönderilen varlık, bir dosyanın kendisini içeren bir dizine tabi olduğu şekilde bu URI'ye bağlıdır, bir haber makalesi gönderildiği bir haber grubuna veya bir kayıt bir veritabanına bağlıdır.
POST yöntemi tarafından gerçekleştirilen eylem, bir URI tarafından tanımlanabilecek bir kaynakla sonuçlanmayabilir. Bu durumda, yanıtın sonucu tanımlayan bir varlık içerip içermediğine bağlı olarak, 200 (Tamam) veya 204 (İçerik Yok) uygun yanıt durumudur.
İnsanların QueryString'i görmesini istemediğimde veya QueryString büyüdükçe POST kullanıyorum. Ayrıca, dosya yüklemeleri için POST gerekir.
GET'i kullanırken bir sorun görmüyorum, QueryString'de bir şeyler tutmanın mantıklı olduğu basit şeyler için kullanıyorum.
GET kullanılması, POST'un çalışmadığı yerlerde de mümkün olan belirli bir sayfaya bağlanmaya izin verir.
Asıl amaç, GET'in verileri geri almak için kullanılması ve POST'un herhangi bir şey olmasıydı. Kullandığım temel kural, sunucuya bir şey gönderirsem POST kullanmamdır. Yalnızca verileri geri almak için bir URL çağırıyorsam GET kullanıyorum.
Wikipedia'da HTTP hakkındaki makaleyi okuyun . Protokolün ne olduğunu ve ne yaptığını açıklayacaktır:
ALMAK
Belirtilen kaynağın temsilini ister. GET'in, web uygulamalarında işlem yapmak için kullanma gibi yan etkilere neden olan işlemler için kullanılmaması gerektiğini unutmayın. Bunun bir nedeni GET'in robotlar veya tarayıcılar tarafından keyfi olarak kullanılabilmesidir, bu da bir talebin neden olması gereken yan etkileri dikkate alması gerekmez.
ve
POST İşlenecek verileri (örneğin, bir HTML formundan) tanımlanan kaynağa gönderir. Veriler isteğin gövdesine dahil edilir. Bu, yeni bir kaynak oluşturulmasına veya mevcut kaynakların veya her ikisinin güncellenmesine neden olabilir.
W3C'de URI'ler, Adreslenebilirlik ve ne zaman kullanılacağını açıklayan HTTP GET ve POST kullanımı adlı bir belge vardır . Anmak
1.3 HTTP GET veya POST Seçimi için Hızlı Kontrol Listesi
- Aşağıdaki durumlarda GET kullanın:
- Etkileşim daha çok bir soru gibidir (yani sorgu, okuma işlemi veya arama gibi güvenli bir işlemdir).
ve
- Aşağıdaki durumlarda POST kullanın:
- Etkileşim daha çok bir emir gibidir veya
- Etkileşim, kaynağın durumunu kullanıcının algılayacağı şekilde değiştirir (örneğin, bir hizmete abonelik) veya o Kullanıcı, etkileşimin sonuçlarından sorumlu tutulur.
Bununla birlikte, HTTP GET veya POST kullanmaya ilişkin nihai karardan önce, lütfen hassas veriler ve pratik konular için de dikkate alın.
Bir HTML formu gönderdiğinizde pratik bir örnek verilebilir. Ya belirtmek yazı veya almak formu eylem için. PHP $ _GET ve $ _POST değerlerini buna göre dolduracaktır.
PHP'de POST
veri limiti genellikle php.ini
. GET
inandığım sunucu / tarayıcı ayarları ile sınırlıdır - genellikle 255
bayt civarındadır.
Gönderen w3schools.com :
HTTP nedir?
Köprü Metni Aktarım Protokolü (HTTP), istemciler ve sunucular arasındaki iletişimi sağlamak üzere tasarlanmıştır.
HTTP, bir istemci ile sunucu arasında bir istek-yanıt protokolü olarak çalışır.
Bir web tarayıcısı istemci olabilir ve web sitesini barındıran bir bilgisayardaki bir uygulama sunucu olabilir.
Örnek: Bir istemci (tarayıcı) sunucuya bir HTTP isteği gönderir; sunucu istemciye bir yanıt döndürür. Yanıt, istekle ilgili durum bilgilerini içerir ve ayrıca istenen içeriği de içerebilir.
İki HTTP İstek Yöntemi: GET ve POST
Bir istemci ve sunucu arasında bir istek yanıtı için yaygın olarak kullanılan iki yöntem şunlardır: GET ve POST.
GET - Belirtilen bir kaynaktan veri ister POST - Belirtilen bir kaynağa işlenecek verileri gönderir
Burada büyük farkları ayırt ediyoruz:
POST GET PUT DELETE'in basit sürümü
Önemli olan şey, gönderdiğiniz her şeyin GET
URL yoluyla gösterilmesidir. İkinci olarak, Ceejayoz'un dediği gibi, bir URL için karakterlerde bir sınır vardır.
Diğer bir fark ise POST genellikle iki HTTP işlemi gerektirirken GET yalnızca bir tane gerektirir.
Düzenleme: Açıklığa kavuşturmak gerekir - ortak programlama kalıpları için. Genellikle bir POST'a düz bir HTML web sayfasıyla yanıt vermek, çeşitli nedenlerden dolayı şüpheli bir tasarımdır, bunlardan biri can sıkıcı "bu formu yeniden göndermeniz gerekir, bunu yapmak ister misiniz?" düğmesine basın.
expect: 100-continue
başlıkla POST yapmaktır ve yalnızca sunucu bir ile yanıt verdiğinde veri gönderir 100 CONTINUE
.
Başkaları tarafından yanıtlandığı gibi, get ile url boyutunda bir sınır vardır ve dosyalar yalnızca posta ile gönderilebilir.
Ben onu eklemek istiyorum olabilir Bir yayınla eylemleri bir get bir veritabanına şeyler ekleyip gerçekleştirin. Bir komut dosyası bir gönderi veya alma aldığında, yazarın yapmasını istediği her şeyi yapabilir. Anlayış eksikliğinin, kitabın seçtiği ifadelerden veya onu nasıl okuduğunuzdan kaynaklandığına inanıyorum.
Bir komut dosyası yazar gerektiği veritabanını değiştirmek ve sadece bilginin geri alınması için olsun kullanmak yayınlarını kullanabilir.
Komut dosyası yazma dilleri, isteğe erişmek için birçok yöntem sağladı. Örneğin, PHP $_REQUEST
bir gönderi veya get almak için kullanılmasına izin verir . Kişi bundan daha spesifik $_GET
veya lehine kaçınmalıdır $_POST
.
Web programlamasında yorum için çok daha fazla alan vardır. Orada neler biri gerektiği ve hangi biri olabilir , ama hangisi daha iyi sık sık tartışmaya açık olduğunu. Neyse ki, bu durumda, belirsizlik yoktur. Sen gerektiğini verileri değiştirmek için mesajları kullanın ve gereken bilgileri almak için olsun kullanın.
Gorgapor, mod_rewrite
hala sıklıkla kullanır GET
. Sadece daha dostça bir URL'yi GET
sorgu dizesi içeren bir URL'ye çevirmeye izin verir .
HTTP Post verilerinin, farklı tarayıcıların GET'ler için farklı sınırları olduğu için veri miktarı üzerinde belirli bir sınırı yoktur. RFC 2068 şunları belirtmektedir:
Bazı eski istemci veya proxy uygulamaları bu uzunlukları doğru şekilde desteklemeyebileceğinden, sunucular 255 baytın üzerindeki URI uzunluklarına bağlı olma konusunda dikkatli olmalıdır.
Özellikle, ne için kullanıldıkları için doğru HTTP yapılarını kullanmalısınız. HTTP GET'lerin yan etkileri olmamalı ve HTTP Proxy'leri vb. Tarafından güvenle yenilenebilir ve saklanabilir.
Bir URL kaynağına veri göndermek istediğinizde HTTP POST'ları kullanılır.
HTTP GET kullanımı için tipik bir örnek Arama'dadır, yani Arama? Sorgu = benim + sorgu HTTP POST kullanımı için tipik bir örnek, çevrimiçi bir forma geri bildirim göndermektir.