Cevabımı okumadan önce @Neil ile hemfikir olduğumu söylemek isterim. Savaşlarımızı seçmeliyiz. Genellikle elimizden gelenin en iyisini yapmak istiyoruz, ancak bazen tartışma için çok az yer var ve isteğimize karşı kararlar almak zorundayız.
Neyse, Neil'in cevabında bir şeyi daha özlüyorum. Belgeler . Yalnızca geliştiricilerin POST isteklerinin /search
güvenli olduğunu bilmelerini sağlamak .
Bahsedilen.
1. GET'e bir şans verin
GET
İlk önce seçeneği düşünün . Bu soru URL’sinin maksimum uzunluğunu kontrol edin . En uzun sorgu dizenizin 2000 karakterden uzun olup olmadığını değerlendirin. Olmazsa ve olmasını beklemiyorsanız devam edin GET
. Çirkin görünebilir, ama en azından URL'yi işaretleyebilirsiniz ve elbette, yöntemin anlambiliminden (idempotence, güvenli ve önbellekleme) elde edilen tüm avantajları vardır.
1.1 Sorgu dizesini kodlamayı deneyin
Örneğin, 64 tabanında . Javascript bile 64 taban kodlamasını destekler .
Bu nasıl çalışır:
- JSON'u tüm filtrelerle oluşturun ve normalleştirin.
- Dizeye ayrıştır
- Kodla
- Kodlanmış JSON'u istek param (
/search?q=SGVsbG8gV29ybGQh....
) olarak gönderin .
- Sunucu tarafında, q paramunun kodunu çözün .
- JSON dizesini seri hale getirin
Önceden, mümkün olan en uzun JSON dizesini yapın, kodlayın ve uzunluğu alın. Kodlanmış dizenin URL'ye uyup uymadığını değerlendirin. Aşağıdaki snippet'i Fiddle.js üzerinde test etmeniz için uyguladım . (Umarım hala çalışır) 1
Base 64 kodları deterministik ve geri dönüşümlüdür, bu nedenle çarpışma olasılığı yoktur.
Kodlanmış sorgularla, aramaları DB'ye kaydedebilir, URL'yi yer imlerine ekleyebilir, bağlantıları paylaşabiliriz, vb. Ve tabii ki, dizeden kaçmak / unescape yapmak zorunda değiliz.
1.2 Diğer adlarla deneyin
REST API'lerinin nasıl tasarlandığına dair bu blogu okuduğumda bir alternatif daha hatırladım. Yaygın sorgular için takma adlar .
Bunları sonraki nedenlerden dolayı ilginç buluyorum
Sorgu dizesi uzunluğunu kısaltın. API'yi daha temiz ve kullanıcı dostu yapar
GET / biletler /? Durum = kapalı & kapalıAt = xxx -
GET / biletler / yeni kapanan /
Daha fazla takma ad veya daha fazla istek parametresiyle birlikte kullanılabilir.
GET / bilet /? Durum = kapalı & kapalıAt = xxx & içinde = 30dk vs
GET / biletler / yeni kapatılan /?
Takma adları kodlanmış sorgu dizeleriyle birleştirebiliriz
GET / bilet /? Durum = kapalı & kapalıAt = xxx & içinde = 30dk vs
GET / biletler / yeni kapatılan /? Q = SGVsbG8g ...
1: JSON kullandım, ancak sunucu tarafında seriyi kaldırır çözmez diğer biçimleri de kullanabiliriz.
search?q=t
,search?q=te
,search?q=test
, vb. Sunucunuzun zarar görmemesi için sorgunun ne sıklıkla gönderileceğini sınırlamayı düşünün. Alternatif olarak birçok bilgiyi geri gönderebilirsiniz ve müşteri tarafında filtreleme yapabilirsiniz. Kullanıcı işleri büyük ölçüde daraltabilecek geniş kategorilere girerse işe yarar.