2015-04-10 21 views
25

URI'de çok uzun parametreler dizisi görmek istemiyorum. Yani, GET yöntemi json verilerini kullanabilir mi? Durumumda, verilen parametrelerin sonucunu filtrelemem gerekiyor. Çok fazla parametre varsa, uzunluk URI sınırını aşabilir. Yani, bu problem için en iyi uygulama var mı?Restful API için, GET yöntemi json verilerini kullanabilir mi?

+1

Bu soru en az haftada bir kez SO'da sorulur. Her zaman aynı iki karşıt cevap olarak önerilmektedir: 1) evet, bir istek gövdesi ile 'GET' RESTful, 2) hayır, değil. Hepimiz tekrar tekrar yazmamızdan yeni bir şey öğrenemeyiz. Şimdilik, bu soruyu kapatmak için oy veriyorum çünkü bu bir kopya. Aynı zamanda kapalı olmalıdır çünkü cevaplar temelde fikir temelli. –

cevap

2

Sorunuzu yanıtlamak için, evet, bir GET isteğinin bir parçası olarak (URL-kodla sağladıysanız) JSON'u URI'ye geçirebilirsiniz. Bununla birlikte, bunun nedenini düşünmeniz URI'nin uzunluğu nedeniyle, JSON kullanarak kendi kendini yenileyecektir (gerekli olandan daha fazla karakter tanıtmak).

senin de Teoride

+1

Böyle bir istek HTTP üzerinden RPC'dir. Bu RESTful değil. –

+0

@Tichodroma Üzgünüz, ama bu tamamen yanlış. Çağrıyı bir URI tarafından tanımlanan bir kaynağa yönlendiriyorsa, HTTP protokolü tarafından tanımlanan bir yöntemle, hedef kaynak tarafından tanımlanan POST semantikleri ile, bu RPC değildir. REST de olmayabilir, ancak RPC değil. JSON yükü, HTTP yöntemi anlambilimine dayanmak yerine, URI yerine ve kullanılacak yöntem yerine tanımlayıcı içeriyorsa RPC olur. –

16

(almamız halinde API tarafından çözümlenen) düzenli CGI tarzı (param1=val1&param2=val2) ya da JSON, bir POST isteği gövdesinde Parametrelerinizi göndermek önermek, hiçbir şey bir istek göndererek engelliyor var Bir GET talebi içinde. HTTP protokolü buna izin verir, ancak tanımlanmış bir semantik içermez, bu yüzden bir istemci bir GET yükünü gönderdiğinde tam olarak ne olacağını belgelemek size kalmıştır. Örneğin, bir JSON gövdesindeki parametrelerin, querystring parametrelerine veya tamamen başka bir şeye eşdeğer olup olmadığını tanımlamanız gerekir.

Bununla birlikte, açıkça tanımlanmış bir semantik olmadığından, uygulamanızla istemci arasındaki uygulamaların bunlara saygı göstereceğine dair hiçbir garantiniz yoktur. Bir sunucu veya proxy, tüm isteği reddedebilir veya vücudu ya da başka bir şeyi görmezden gelebilir. Bozuk uygulamalarla başa çıkmanın REST yolu, uygulamanızdan ayrıştırılacak şekilde atlatmaktır, bu yüzden en iyi uygulamalar olarak değerlendirilebilecek iki seçeneğiniz olduğunu söyleyebilirim.

Diğer seçenekler, diğer yanıtlar tarafından önerilen şekilde GET yerine POST kullanmaktır. POST HTTP tarafından standartlaştırılmadığı için, tam olarak ne yapması gerektiğini belgelemeniz gerekir. Bu en az RESTful seçeneğidir, ama sorun değil.

Tercih ettiğim RESTful seçeneği, uygulamanızı GET yükünün hiçbir zaman kurcalanmadığı varsayılarak uygulamaktır. Sonra, bir şeyin bozuk bir uygulaması varsa, istemcilerin HTTP yöntemini ile HTTP yöntemini geçersiz kılmasına izin verirsiniz; bu, istemcilerin POST ile HTTP yöntemlerini taklit etmesi için popüler bir kuraldır. Bu nedenle, bir istemcinin bozuk bir uygulaması varsa, isteğini POST olarak yazabilir, X-HTTP-Method-Override: GET yöntemini gönderebilir ve uygulama uygulamanızdan ayrıştırılan bir katmanı olabilir ve yöntemi buna göre yeniden yazar. Bu bir temizlikçi iseniz en iyi seçenektir.

+0

http://stackoverflow.com/a/983458/1907906 hakkında ne düşünüyorsunuz? –

+0

@Tichodroma Fielding aynı şeyi söylüyor. Bir GET gövdesinin HTTP protokolü tarafından tanımlanan ayrıştırma semantiği yoktur, ancak bu, taşıma protokolü olarak HTTP kullanılarak bir REST API'sinde kullanışlı olacağı anlamına gelmez.Yalnızca taşıma protokolünün kendisi için alakasız olduğu ve bazı uygulamalara uyulmayacağı anlamına gelir. –

İlgili konular