Form Gönderimi — Bir Tıkla İki Havale Nasıl Olur?
Önce şunu oku: JavaScript Olay Döngüsü — setTimeout(0) Neden Sonra Yazıyor?
30 saniyede özet
Kullanıcı bir kez gönderir ama sunucuya iki istek gider: çift tıklamadan ya da kaybolan bir cevaptan sonraki tekrar denemeden. Kilit ilkini durdurur; ikisini birden durduran şey idempotency anahtarıdır.
Kapıdaki zile heyecanla iki kez basarsın ve içeriden iki kişi koşar. Ya da zili çalarsın, ses gelmez, bir daha çalarsın; meğer ilkinde duymuşlardı. Bir form da tam olarak böyle iki kez gönderilir.
-
Bayt: Havale formu hazır. Gönder'e basınca istek gidiyor, her şey yolunda.
-
Sen: Bir müşteri aynı havalenin iki kez yapıldığını söylüyor.
-
Bayt: Ama tek düğme var, tek bir fetch çağrısı!
-
Bayt: Bir düğme bir istek demek değil. İkinci isteğin nereden geldiğine bakalım.
Bir düğme, iki istek
En bilinen yol çift tıklamadır. İlk istek dönmeden kullanıcı bir daha tıklar ve kod ikinci bir istek gönderir. Buna double submitTek bir gönderimin sunucuya iki istek olarak ulaşması: çift tıklama ya da kaybolan cevabın ardından tekrar deneme. Sunucu tarafında idempotency anahtarıyla durdurulur.Sözlükte gör → denir.
Daha sinsi yol ağdır. Sunucu havaleyi yapar ama cevap yolda kaybolur; istemci zaman aşımına düşüp aynı isteği tekrar dener.
Kafam karıştı, daha basit anlat
Bir gönderim iki istek olabilir: ya kullanıcı iki kez tıklar ya da kaybolan bir cevabın ardından istek tekrarlanır.
Kullanıcı Gönder'e çift tıkladı ve kodda hiçbir koruma yok. Sunucuya kaç istek gider?
Sunucu havaleyi yaptı ama cevap yolda kayboldu. İstemci ne görür?
Kilit neyi durdurur?
Gönder düğmesi istek dönene kadar kilitleniyor. Kullanıcı bir kez tıkladı; sunucu havaleyi yaptı ama cevap kayboldu ve istemci aynı isteği tekrar denedi. Kaç havale olur? Cevabı göster
İki. Kilit ikinci tıklamayı durdurur, ama tekrar deneme bir tıklama değildir. Sunucu iki isteği iki ayrı havale sanar.
Adım adım oku
- Zile iki kez basıldı: iki paket gönderildi.
- Zil kilitliyken ikinci basış yok sayıldı.
- Cevap kayboldu; kurye aynı paketle tekrar geldi.
- Fiş numarası tanındı: bu paket zaten gönderilmişti.
Çözüm sunucu tarafında: her gönderim bir idempotencyAynı işlemin bir kez de on kez de çalışsa aynı sonucu vermesi. Dağıtık sistemde timeout aldığında işlemin yapılıp yapılmadığını bilemediğin için zorunludur.Sözlükte gör → anahtarı taşır. Anahtar form ilk kez gönderilirken bir kez üretilir ve her tekrar denemede aynı kalır.
Sunucu bir anahtarı en fazla bir kez işler. Aynı anahtarla ikinci istek gelirse yeni havale açmaz, ilkinin sonucunu döndürür. Sunucunun bu tarafı REST ve idempotency dersinde.
Kafam karıştı, daha basit anlat
Kilit kullanıcıyı, anahtar ağı durdurur. Para gibi bir işte ikisi birlikte gerekir.
İstek beklerken düğme kilitli. Cevap kayboldu ve istemci aynı isteği tekrar denedi. Kaç havale olur?
Idempotency anahtarı sunucuda nasıl kullanılır?
Kendin gör
Bir gönderim, kaç havale?
Tohum 229479Oynat ya da adımla.
Şu an ne oldu?
Kullanıcı çift tıklıyor
Kullanıcı bir kez göndermek istiyor. Sunucuya kaç istek gidecek, kaç havale olacak?
Görevler0/3
Çift tıkla iki havale yapaçık
İpucu
Varsayılan ayarlar yeter.
Düğme kilitliyken bile iki havale yapaçık
İpucu
Kilidin göremediği bir tekrar var.
Cevap kaybolsa da tek havaleaçık
İpucu
Sunucunun iki isteği aynı gönderim olarak tanıması gerek.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. Çift tıklama, iki istek, iki havale.
- Düğmeyi kilitle. İkinci tık yok sayıldı, tek havale.
- Senaryoyu “cevap kayboluyor” yap. Kilit açıkken bile iki havale.
- Idempotency anahtarını aç. İki istek gitti, tek havale oldu.
Idempotency anahtarı fetch çağrısının içinde crypto.randomUUID() ile üretiliyor. Tekrar denemede ne olur?
Idempotency anahtarı açıkken kullanıcı çift tıkladı ve düğme kilitli değil. Kaç havale olur?
Tuzaklar
Her denemede yeni anahtar. Anahtarı fetch çağrısının içinde üretirsen her tekrar deneme yeni bir anahtar taşır. Sunucu yine iki ayrı istek görür.
Anahtarı hiç yenilememek. Kullanıcı ikinci, gerçekten yeni bir havale yaptığında da aynı anahtar giderse sunucu onu da eski sanar. Başarılı bir gönderimden sonra yeni anahtar üret.
Yalnızca kilide güvenmek. Kilit tarayıcıdadır; sekme yenilenince, ağ tekrar deneyince ya da başka bir istemci çağırınca hiçbir şey yapmaz.
Kafam karıştı, daha basit anlat
Anahtar gönderim başına bir kez üretilir, tekrar denemede aynı kalır, başarıdan sonra yenilenir.
Anahtar oturum başında bir kez üretiliyor ve hiç yenilenmiyor. Kullanıcı ikinci, gerçekten yeni bir havale yapınca ne olur?
Aşağıdaki örnek bir bankacılık uygulamasının havale formundan: düğme beklerken kilitli, her gönderim tek bir anahtar taşıyor, tekrar denemeler aynı anahtarla gidiyor.
Derinleş · Havale formu: kilit ve idempotency anahtarı birlikte 4 dosya · ~66 satır · ilk okumada atlayabilirsin
Kendini sına
Tek bir Gönder düğmesi sunucuya en fazla bir istek gönderebilir.
React'te setPending(true) ile düğme disabled yapılıyor. Neden bir ref bayrağı da eklenir?
Aklında kalacak üç şey
- 1 Bir gönderim iki istek olabilir: çift tıklama ya da cevabı kaybolan isteğin tekrar denenmesi. İkisi de sunucuda iki ayrı işlem gibi görünür.
- 2 İstek beklerken düğmeyi kilitlemek çift tıklamayı durdurur, ama aynı gönderimin tekrar denenmesini durduramaz.
- 3 Her gönderimde bir kez üretilen ve her denemede aynı kalan bir idempotency anahtarı, sunucunun aynı işi ikinci kez yapmamasını sağlar.
4 kart sonraki derste seni bekliyor