2012-06-10 7 views
9

Bu haftanın başlarında, anlambilim ihlali gibi bir şey yapmak zorunda kaldım. Açıklamama izin ver. HTTP GET ve POST semantik ve sınırlamaları

Ben parametrelerin belirli bir sayı ile bir hizmet için bir istek yapmaktı basit AJAX istemci uygulaması, yapıyordu. Tüm uygulama temelde salt okunur olduğu için, HTTP GET kullanarak gitmek için bir yol olduğunu düşündüm. Geçmem gereken bazı parametreler basitti (sıralama düzeni veya sayfa numarası gibi). Bununla birlikte, gerekli parametrelerden biri değişken uzunlukta olabilir ve bu beni endişelendiriyordu. GET isteğinin sorgusundaki tüm parametreleri kodladığımdan beri, bu bana gereksiz bir upper limit of (roughly) 2000 characters for the request URL verdi. Ve ne olursa olsun, 500 karakter uzunluğunda istek URL’lerini görmek istemedim.

Dolayısıyla, bir POST isteğinin böyle bir sınırlaması olmadığı için, değiştirmeye karar verdim. Ama bu doğru hissetmiyor. Bir POST'un verilerin modifikasyonunu ifade ettiği izlenimi altındayım - ancak bunu sadece salt okunur bir istek için kullanıyorum.

Bunu yapmanın daha iyi bir yolu var mı? Bir çok parametre ile bir GET yapmak için? Tek bir yöntemi duydum - parametrelerinin başlangıç ​​POST'unu kendiniz yapıyorsunuz ve ardından bir GET gerçekleştirin. Ancak, bu teknik arzulanan çok şey bırakır.

Ama bu özel durumda geçmiş bakarak, HTTP istek yöntemlerinden gerçek semantik ve sınırlarının neler ? Ve GET neden herhangi bir parametre yükünü desteklemiyor? URL'de querystring kullanmak neredeyse bir kesmek gibi geliyor. Bu konudaki

+0

Bu gönderinin neden veri modifikasyonu olduğunu düşündüğünü düşünüyorsunuz? –

+1

@ConradFrix: Formların gönderilmesinde, dosya yüklemesinde ve [genel kimliksiz eylemler.] Kullanıldığından (http://en.wikipedia.org/wiki/POST_ (HTTP) #Affecting_server_state) – voithos

+0

Bir Ajax uygulaması yazmak, neden URL uzunluğuna önem veriyorsunuz?Ayrıca, 2000 karakter sınırının yalnızca tarayıcı URL'leri için geçerli olduğunu unutmayın, Ajax istekleri değil (sunduğunuz bağlantıya yapılan yorumlarda belirtildiği gibi). –

cevap

12

birkaç nokta:

  • HTTP Spec (RFC 2616) istekleri parametreleri olması GET forbit değil, bu nedenle HTTP GET kendisinin semantik meselesi değil. Ancak, (istemciler, hizmetlerin veya vekiller için) sayıda HTTP yığınlarının HTTP isteklerine cesetleri korusun, bunları kullanamaz gerçeği çoğunlukla HTTP GET ile bir semantik konuya daha bir uygulama ayrıntı (oldukça yaygın) 'dir
  • istekleri Benzer şekilde, URI'nin (veya sorgu dizesi) uzunluğunun sınırlaması da RFC'de belirtilmez. Çoğunlukla sunucu istemcilerinin sunucu kaynaklarını tüketmesini önlemek için çeşitli HTTP sunucu yığınları tarafından uygulanan bir güvenlik azaltmadır (örneğin, IIS/ASP.NET'te varsayılan sınır 2k'dır, ancak web.config'deki bazı öğeler aracılığıyla bunu artırabilirsiniz). Yine, bu bir semantik değil pratik bir konu.
  • POST istekleri, REST felsefesini izliyorsanız veri değişikliğini gösterir, ancak salt okunur işlemler için kullanılan birçok HTTP POST isteğinin örnekleri vardır. SOAP, çağıran işlemin "güvenli" veya "değiştirici" olup olmadığına bakılmaksızın tüm isteklerinde POST kullanır. Bu yüzden bu işlemler için POST kullanabilirsiniz. Ancak, REST (ve "canonical" HTTP) kullanımından saparak, GET istekleri için uygulanabilecek, ancak POST için uygulanamayan, önbelleğe alma gibi bazı özelliklerin kaybedilmesini sağlayabilirsiniz.
  • İki istek kullanma örneğiniz (sonuçlarla "getiri elde etmek için + GET parametresiyle" POST) aşırı sıkışık görünüyor. Bahsettiğim gibi, POST istekleri mutlaka kaynakların değiştirilmesi anlamına gelmez, bu nedenle tek bir istek yeterli olduğunda işleminize erişmek için yeni bir "protokol" (POST + GET) oluşturmanız gerekmez.
+2

+1 güzel cevap, başka önemli bir nokta: GET idempotent olması gerekiyordu, bu yüzden istemci tarafından otomatik olarak tekrar denenebilir (ve), POST asla denenmez. –