Π‘ΠΎΠΊΠ΅Ρ Π²Π΅Π±: WebSockets β ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΠΉ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ Π²Π΅Π± / Π₯Π°Π±Ρ
HTML5 | ΠΠ΅Π±-ΡΠΎΠΊΠ΅ΡΡ
89
ΠΠ΅Π±-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ — HTML5 — ΠΠ΅Π±-ΡΠΎΠΊΠ΅ΡΡ
Π‘Π΅ΡΠ²Π΅ΡΠ½ΡΠ΅ ΡΠΎΠ±ΡΡΠΈΡ, ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΠ΅ ΡΠ°Π½Π΅Π΅, ΡΠ²Π»ΡΡΡΡΡ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Ρ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅ΡΠ°. ΠΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΠ²ΡΠ·Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΠ΄Π½ΠΎΡΡΠΎΡΠΎΠ½Π½Π΅ΠΉ. ΠΡΠ°ΡΠ·Π΅Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π²ΡΡΡΠΏΠ°ΡΡ Π² Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠΉ Π΄ΠΈΠ°Π»ΠΎΠ³ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ.
ΠΡΠ»ΠΈ Π²Ρ ΡΠΎΠ·Π΄Π°Π΅ΡΠ΅ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ΅ΡΡΠ΅Π·Π½ΠΎΠ΅ Π΄Π²ΡΡΡΠΎΡΠΎΠ½Π½Π΅Π΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π±ΡΠ°ΡΠ·Π΅ΡΠ° Ρ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, Π»ΡΡΡΠΈΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠΌ ΠΊ Π΅Π³ΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ (Π½Π΅ ΠΏΡΠΈΠ±Π΅Π³Π°Ρ ΠΊ ΠΏΠΎΠΌΠΎΡΠΈ Flash) Π±ΡΠ΄Π΅Ρ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° XMLHttpRequest. Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΈΠΏΠ° ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΡΠΎΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ. ΠΠΎ Π·Π΄Π΅ΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΈ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ.
ΠΡΠ΅ΠΆΠ΄Π΅ Π²ΡΠ΅Π³ΠΎ, ΠΎΠ±ΡΠ΅ΠΊΡ XMLHttpRequest Π½Π΅ ΠΎΡΠ΅Π½Ρ Ρ ΠΎΡΠΎΡΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ Π±ΡΡΡΡΠΎΠ³ΠΎ ΠΎΠ±ΠΌΠ΅Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΡΠ°ΡΠ΅). ΠΠΎΡΠΎΠΌ, Π² Π½Π΅ΠΌ Π½Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ²ΡΠ·Π°ΡΡ ΠΎΠ΄ΠΈΠ½ Π²ΡΠ·ΠΎΠ² Ρ Π΄ΡΡΠ³ΠΈΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π½ΠΎΠ²ΠΎΠΌ Π·Π°ΠΏΡΠΎΡΠ΅ ΠΎΡ Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡΡ ΡΠ΅ΡΠ²Π΅Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΡΠΈΡΠ»ΡΡΡ Ρ ΡΠ°ΠΌΠΎΠ³ΠΎ Π½Π°ΡΠ°Π»Π°, ΠΊΠΎΠΌΡ ΡΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ° ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ. ΠΠΎΡΡΠΎΠΌΡ ΡΡΠΎΠ²Π΅Π½Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΊΠΎΠ΄Π° Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΡΠ΄Π° ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΎΡ Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠ΅Π½Ρ Π±ΡΡΡΡΠΎ Π²ΡΡΠ°ΡΡΠΈ Π΄ΠΎ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌΠΎΠΉ.
ΠΠ»Ρ Π²ΡΠ΅Ρ ΡΡΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, Ρ ΠΎΡΡ ΠΎΠ½ΠΎ Π΅ΡΠ΅ Π½Π΅ Π²ΠΏΠΎΠ»Π½Π΅ Π³ΠΎΡΠΎΠ²ΠΎ. ΠΡΠΈΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠΎΠ² (web sockets), ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π±ΡΠ°ΡΠ·Π΅ΡΡ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΎΡΠΊΡΡΡΠΎΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΈ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
Π’Π΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠΎΠ² Π²ΡΠ·Π²Π°Π»Π° Π±ΠΎΠ»ΡΡΠΎΠ΅ Π²ΠΎΠ·Π±ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ Π² ΡΡΠ΅Π΄Π΅ Π²Π΅Π±-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², Π½ΠΎ ΠΎΠ½Π° Π΅ΡΠ΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ°Π·Π²ΠΈΡΠΈΡ, Ρ ΠΎΡΡ ΡΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ Π½Π΅ΠΏΠ»ΠΎΡ ΡΡ Π±ΡΠ°ΡΠ·Π΅ΡΠ½ΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ:
ΠΡΠ°ΡΠ·Π΅Ρ | IE | Firefox | Chrome | Safari | Opera | Safari iOS | Android |
ΠΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½Π°Ρ Π²Π΅ΡΡΠΈΡ | 10 | 6 | 14 | 6 | 12.1 | 6 | — |
ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π»ΡΡΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΡ, Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ Chrome, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ Π΄Π»Ρ Π½ΠΈΡ .
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠ°ΠΌ
ΠΠ΅Π±-ΡΠΎΠΊΠ΅ΡΡ ΡΠ²Π»ΡΡΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ. ΠΠ½ΠΈ Π°ΠΊΡΡΠ°Π»ΡΠ½Ρ Π΄Π»Ρ ΡΠ°ΠΊΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠ°ΠΊ ΡΠ°Ρ, ΠΌΠ°ΡΡΠΈΠ²Π½ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΠΈΠ³ΡΡ ΠΈΠ»ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΠΏΠΈΡΠΈΠ½Π³ΠΎΠ²ΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ. ΠΠ΅Π±-ΡΠΎΠΊΠ΅ΡΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ ΡΠΈΠΏΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΠΈΡ Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π΄Π²ΠΈΠΆΠΈΠΌΡΡ JavaScript, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ»Π°.
Π Π΅ΡΠ΅Π½ΠΈΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠΎΠ² ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΡΠ΅Π·Π²ΡΡΠ°ΠΉΠ½ΠΎ ΡΠ»ΠΎΠΆΠ½Ρ. Π Π°Π·ΡΠ°Π±ΠΎΡΠ°ΡΡ JavaScript-ΠΊΠΎΠ΄ Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΡ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ. ΠΠΎ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π²Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΡΡΡΡ Π±Π΅ΡΠ΅Π½ΡΠ΅ Π·Π½Π°Π½ΠΈΡ ΠΈ Π½Π°Π²ΡΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π²ΠΊΠ»ΡΡΠ°Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΎΠ² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΠΈ ΠΈ ΡΠ΅ΡΠ΅Π²ΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ.
ΠΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠΎΠ² Π½Π° Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅ΡΠ΅ Π²Π°ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΡΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ, ΠΊΠ°ΠΊ ΠΎΠΆΠΈΠ΄Π°Π΅ΡΡΡ, Π½Π°Π·ΡΠ²Π°ΡΡΡΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠΎΠ². ΠΠ° ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π²ΠΎΠ·Π»Π°Π³Π°Π΅ΡΡΡ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΡ Π·Π° ΠΊΠΎΠΎΡΠ΄ΠΈΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Π²ΡΠ΅Ρ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ², ΠΈ ΠΏΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ° ΠΎΠ½Π° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π±Π΅Π·ΠΎΡΡΠ°Π½ΠΎΠ²ΠΎΡΠ½ΠΎ.
ΠΠ½ΠΎΠ³ΠΈΠ΅ Ρ ΠΎΡΡΠΈΠ½Π³ΠΎΠ²ΡΠ΅ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Π½Π΅ Π΄ΠΎΠΏΡΡΠΊΠ°ΡΡ Π΄ΠΎΠ»Π³ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, Π΅ΡΠ»ΠΈ ΡΠΎΠ»ΡΠΊΠΎ Π²Ρ Π½Π΅ ΠΎΠΏΠ»Π°ΡΠΈΡΠ΅ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΡΠΉ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅Ρ, Ρ.Π΅. ΡΠ΅ΡΠ²Π΅Ρ, ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°ΡΡΠΈΠΉ Π»ΠΈΡΡ Π²Π°Ρ ΡΠ°ΠΉΡ. ΠΡΠ»ΠΈ Ρ Π²Π°Ρ ΠΎΠ±ΡΡΠ½ΡΠΉ ΠΎΠ±ΡΠΈΠΉ Ρ ΠΎΡΡΠΈΠ½Π³, Π²Ρ, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, Π½Π΅ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΡΡ Π½Π° Π½Π΅ΠΌ ΡΡΡΠ°Π½ΠΈΡΡ, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΡ. ΠΠ°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π²Ρ ΡΠΌΡΠ΄ΡΠΈΡΠ΅ΡΡ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ΅ΡΠ²Π΅Ρ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠΎΠ² ΠΈ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π΅Π³ΠΎ Π² ΡΠ°Π±ΠΎΡΠ΅ΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ, Π²Π»Π°Π΄Π΅Π»Π΅Ρ Π²Π°ΡΠ΅Π³ΠΎ Ρ ΠΎΡΡΠΈΠ½Π³Π°, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, Π²ΡΡΠ²ΠΈΡ ΠΈ Π²ΡΠΊΠ»ΡΡ
Π‘ΠΊΠ°Π· ΠΎ ΡΠΎΠΌ ΠΊΠ°ΠΊ Ρ ΡΠ²ΠΎΠΉ REST ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ Ρ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠ°ΠΌΠΈ ΠΏΠΈΡΠ°Π» / Π₯Π°Π±Ρ
ΠΡΠ° ΡΡΠ°ΡΡΡ ΠΏΠΎΡΠ²ΡΡΠ΅Π½Π° ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΌΡ REST ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΡ (Π΄Π»Ρ Python 3), ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠΎΠ² Π΄Π»Ρ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½ΡΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ. Π ΡΠΎΠΌ ΠΎΡΠΊΡΠ΄Π° ΠΏΡΠΈΡΠ»Π° ΠΈΠ΄Π΅Ρ, Ρ ΡΠ΅ΠΌ ΠΌΠ½Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ ΠΏΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΡΠ²ΠΎΠ΅ΠΉ ΠΏΠ΅ΡΠ²ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π΄Π»Ρ Python ΠΈ ΡΡΠΎ ΠΈΠ· ΡΡΠΎΠ³ΠΎ Π² ΠΈΡΠΎΠ³Π΅ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ, Ρ ΡΠ°ΡΡΠΊΠ°ΠΆΡ Π΄Π°Π»Π΅Π΅.
ΠΠ»Ρ ΡΠ΅Ρ
, ΠΊΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π° ΡΡΠ° ΡΡΠ°ΡΡΡ β ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, Π·Π°Ρ
ΠΎΠ΄ΠΈΡΠ΅ ΠΏΠΎΠ΄ ΠΊΠ°Ρ.
1. ΠΠ΄Π΅Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ°
ΠΠ΄Π΅Ρ Π·Π°ΡΠΎΠ΄ΠΈΠ»Π°ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π² ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π΅ ΠΠΏΡΠ΅Π»Π΅ 2015, ΠΊΠΎΠ³Π΄Π° Ρ Π·Π°Π΄Π΅ΡΠΆΠ°Π»ΡΡ Ρ ΠΊΠΎΠ»Π»Π΅Π³ΠΎΠΉ Π½Π° ΡΠ°Π±ΠΎΡΠ΅, Ρ ΠΊΠΎΡΠΎΡΡΠΌ ΠΌΡ ΡΠΈΡΠ»ΠΈΠΌΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ Π² ΡΠ²ΠΎΠ΅ΠΉ ΠΊΠΎΠ½ΡΠΎΡΠ΅. Π§ΡΠΎΠ±Ρ ΠΊΠ°ΠΊ-ΡΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΡΠ΅Π±Ρ ΡΠ°Π·Π²Π»Π΅ΡΡ, ΠΏΠΎΠΊΠ° Π·Π°Π½ΠΈΠΌΠ°Π»ΠΈΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, ΠΌΡ ΡΠ΅ΡΠΈΠ»ΠΈ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΡΡ ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ ΠΏΠΈΡΠΎΠ½ΠΎΠ²ΡΠΊΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ . Π ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊ-ΡΠΎ ΡΠΏΠΎΠ½ΡΠ°Π½Π½ΠΎ ΠΏΠΎΠ΄ΠΎΡΠ»ΠΈ ΠΊ ΡΠ΅ΠΌΠ΅ ΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ ΠΈ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π°Π»Π΅Π΅ Π² ΡΠ²ΠΎΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ (Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ ΡΠ°Π±ΠΎΡΠΎΠΉ). ΠΡΠΈ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠΈ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΈΠ΄Π΅Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΠΊΠ»Π°ΡΡΠ½ΠΎ ΠΈΠΌΠ΅ΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Β«Π³ΠΈΠ±ΠΊΠΈΠΉΒ» ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΡ, ΡΠ΅ΡΠ΅Π· ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΎΠ±Π΅ ΡΡΠΎΡΠΎΠ½Ρ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌ. ΠΠ°ΠΆΠ΄ΡΠΉ Π·Π°ΠΏΡΠΎΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ Π² JSON ΡΠΎΡΠΌΠ°ΡΠ΅ ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΈΠ²ΡΡΠ½Ρ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ REST ΠΈ HTTP ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°. Π Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΡΡΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ (Π½ΠΎΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΉ) ΡΠΎ ΡΡΠΎΡΠΎΠ½Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΌΡ-ΡΠΎ ΡΠΎΠ±ΡΡΠΈΡ/ΡΠ°ΠΉΠΌ-Π°ΡΡΡ.
ΠΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ»Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ Ρ ΡΠ΅ΡΠΈΠ»ΡΡ Π²ΠΎΠΏΠ»ΠΎΡΠΈΡΡ ΡΡΡ ΠΈΠ΄Π΅Ρ Π² ΠΆΠΈΠ·Π½Ρ (Π° ΠΏΠΎΡΠ΅ΠΌΡ Π±Ρ ΠΈ Π΄Π°?). Π‘ΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΠ΅Ρ, ΡΠ½ΡΡΠ·ΠΈΠ°Π·ΠΌ ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ Π΄Π»Ρ ΡΠ°Π·Π²ΠΈΡΠΈΡ ΡΠΊΠΎΡΠΈΡΡΠ΅ΠΌΡ ΡΡΠ΅ΡΡΠ΅Π³ΠΎ Python’Π° ΡΠΎΠ»ΡΠΊΠΎ Π΄Π°Π²Π°Π»ΠΎ Π»ΠΈΡΠ½ΡΡ ΠΌΠΎΡΠΈΠ²Π°ΡΠΈΡ ΠΏΠΎΠ±ΡΡΡΡΠ΅Π΅ ΠΏΡΠΈΡΡΡΠΏΠΈΡΡ ΠΊ Π΄Π΅Π»Ρ.
2. ΠΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ΅Π»Π΅ΠΉ
ΠΠ»Ρ ΡΠ΅Π±Ρ, Π»ΠΈΡΠ½ΠΎ, Ρ Π²ΡΠ΄Π΅Π»ΠΈΠ» Π΅ΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠ², Π½Π° ΠΊΠΎΡΠΎΡΡΡ Π±ΡΠ»ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅ΡΠ΅Π½ΠΎ ΡΠΎΡΡΠ΅Π΄ΠΎΡΠΎΡΠΈΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΡΡΠΈΠ»ΠΈΡ ΠΏΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΊΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π±Ρ ΡΠΏΠΎΠΌΡΠ½ΡΡΠΎ ΡΠ°Π½Π΅Π΅:
- ΠΠΎΡΡΠ°ΡΠ°ΡΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ asyncio ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ²
- ΠΠ΅ Π±ΠΎΠ»Π΅Π΅ 1-2 Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ (ΡΠ΅ΠΌ ΠΌΠ΅Π½ΡΡΠ΅, ΡΠ΅ΠΌ Π»ΡΡΡΠ΅)
- ΠΠ΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ Π΄Π»Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ
- ΠΠ΅Π³ΠΊΠΎΡΡΡ Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ (ΡΠΌ. ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΈ Django REST, Flask, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΡΠ΅ ΠΈ Π³ΠΈΠ±ΠΊΠΈΠ΅)
- ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡ ΠΌΠΎΠΆΠ΅Ρ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π»ΡΠ±ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π΅ΠΌΡ ΡΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ
ΠΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, Π²ΡΠΏΡΡΡΠΈΡΡ Π² ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΆΠ΅ Π²Π΅ΡΡΠΈΠΈ Π²ΡΠ΅ Π²ΡΡΠ΅ΡΠΏΠΎΠΌΡΠ½ΡΡΠΎΠ΅ Π΄Π»Ρ ΠΌΠ΅Π½Ρ Π±ΡΠ»ΠΎ ΡΠΎΠ²ΡΠ΅ΠΌ ΡΠ΅ΠΌ-ΡΠΎ Π½Π΅ΡΠ΅Π°Π»ΡΠ½ΡΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΈΠ· ΠΏΡΠΎΡΠ΅ΡΡΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Ρ ΠΏΡΠΎΡΡΠΎ Π±Ρ Π½Π΅ Π²ΡΡ ΠΎΠ΄ΠΈΠ», ΠΏΠΎΡΡΠΎΠΌΡ Π² ΡΠ΅Π»ΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ Π±ΡΠ»ΠΎ ΠΏΡΠΈΠ½ΡΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π·Π±ΠΈΡΡ Π²ΡΠ΅ Π½Π° Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠ΅ Β«ΠΊΡΡΠΎΡΠΊΠΈΒ». ΠΡ ΡΠ΄Π΅Π»Π°ΡΡ, ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ, ΠΏΡΡΡΠΈΡΡ Π² ΡΠ΅Π»ΠΈΠ·, Π° Π·Π°ΡΠ΅ΠΌ ΡΠΆΠ΅ Π΄Π΅Π»Π°ΡΡ ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎΠΉ ΡΡ Π΅ΠΌΠ΅ Π²ΡΠ΅ ΠΎΡΡΠ°Π²ΡΠ΅Π΅ΡΡ. Π‘Π½Π°ΡΠ°Π»Π° ΠΏΠΈΡΠ΅ΠΌ ΡΠΎ, ΡΡΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΊΡΠΈΡΠΈΡΠ½ΡΠΌ Π΄Π»Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ (ΡΠΎΡΡΠΈΠ½Π³, Π²ΡΡΡ ΠΈ, Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ, ΠΈ Ρ.Π΄.), Π° ΠΏΠΎΠ·Π΄Π½Π΅Π΅, ΠΏΠΎ ΠΌΠ΅ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ, Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π½ΠΎΠ²ΡΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π».
3. ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΠΊ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅: Π²ΡΠ±ΠΎΡ ΠΌΠ΅ΠΆΠ΄Ρ Aiohttp vs Gevent vs Autobahn.ws
Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π°ΡΠ°Π»Π°ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π² ΠΊΠΎΠ½ΡΠ΅ ΠΠΏΡΠ΅Π»Ρ 2015. Π§ΡΠΎΠ±Ρ ΠΊΠ°ΠΊ-ΡΠΎ ΠΎΠ±Π»Π΅Π³ΡΠΈΡΡ ΡΠ΅Π±Π΅ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π½Π°ΡΠ°Π»ΠΈΡΡ ΠΏΠΎΠΈΡΠΊΠΈ ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ ΡΠΆΠ΅ Π³ΠΎΡΠΎΠ²ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ (ΠΈΠ»ΠΈ ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ, ΠΎ ΠΊΠΎΡΠΎΡΡΡ ΡΠ°Π½Π΅Π΅ Π½Π΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π»). ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±Ρ ΠΈΠΌΠ΅Π»ΠΈ ΡΡ ΠΎΠΆΡΡ ΠΈΠ΄Π΅Ρ Ρ ΠΌΠΎΠ΅ΠΉ ΠΈΠ»ΠΈ Ρ ΠΎΡΡ Π±Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΠΈΠΌΠ΅Π»ΠΈ ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈ ΡΠΎ, ΡΡΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ ΡΠ΄Π΅Π»Π°ΡΡ β Π½Π΅ Π½Π°ΡΠ»ΠΎΡΡ. ΠΡΠΎ ΠΏΡΠΈΠ²Π΅Π»ΠΎ ΠΊ ΡΡΠ»ΠΎΠΆΠ½Π΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π±ΠΎΠ»ΡΡΡΡ ΡΠ°ΡΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ, ΠΈΡΡ ΠΎΠ΄Ρ ΠΈΠ· ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ Π²ΡΠ΅Ρ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ².
Π― ΡΠ΅ΡΠΈΠ» Π½Π°ΡΠ°ΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΡ. ΠΠ° ΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π±ΡΠ»ΠΎ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΊΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²: aiohttp, gevent ΠΈ autobahn.ws. Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π΅ΡΡΡ ΡΠ²ΠΎΠΈ Π΄ΠΎΡΡΠΎΠΈΠ½ΡΡΠ²Π° ΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠΈ, Π½ΠΎ, Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, Ρ ΠΈΡΡ ΠΎΠ΄ΠΈΠ» ΠΈΠ· ΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅Π³ΠΎ ΠΏΠ΅ΡΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ΄Π°, ΡΡΠΎΠ±Ρ Π½Π΅ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΠ»ΠΎΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΉ ΡΠ°Π· Π³ΠΎΡΠΎΠ΄ΠΈΡΡ ΡΠ²ΠΎΠΈ Π²Π΅Π»ΠΎΡΠΈΠΏΠ΅Π΄Ρ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΡΠ°ΠΌ, Π³Π΄Π΅ ΡΡΠΎ Π½Π΅ Π½ΡΠΆΠ½ΠΎ.
Aiohttp β Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΄Π»Ρ Π²Π΅Π±-ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ, Π±Π°Π·ΠΈΡΡΡΡΠ°Ρ Π½Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ asyncio ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Π½Π°Ρ svetlov. ΠΠ΅ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ Ρ ΠΌΠ΅Π½Ρ Π±ΡΠ» ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠ΅Π°Π»ΡΠ½ΡΠΉ ΠΎΠΏΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, Ρ ΠΎΡΡ ΡΡΠΎΠΈΡ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²Π΅ΡΠ΅ΠΉ ΠΎΡΠ΅Π½Ρ ΠΊΠ»Π°ΡΡΠ½ΠΎ. ΠΠ΄Π½Π°ΠΊΠΎ, ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΠΌΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Ρ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠ°ΠΌΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ ΠΌΠ½Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠΌ (Ρ ΠΎΡΡ, Π² ΡΡΠ΄Π΅ ΡΠ»ΡΡΠ°Π΅Π² ΡΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΄ΠΎΠ±Π½ΠΎ). Π₯ΠΎΡΠ΅Π»ΠΎΡΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-ΡΠΎ Π±ΠΎΠ»ΡΡΠ΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠ°ΠΊ Π² gevent-websocket ΠΈΠ»ΠΈ autobahn.ws, Π³Π΄Π΅ Π² ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅/ΡΠ΅ΡΠ²Π΅ΡΠ΅ Π΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ Π²ΡΠΎΠ΄Π΅ onMessage ΠΈ sendMessage, ΡΡΠΎΠ»Ρ ΠΏΠΎΡ ΠΎΠΆΠΈΠ΅ Π½Π° ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΈΠ· ΡΠΎΠ±ΡΡΠΈΠΉΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° Twisted). Π ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠΌ ΠΆΠ΅ β Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½Π°.
Gevent ΠΏΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΠΈ Π±ΡΠ» ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ΅Ρ ΠΏΠ΅ΡΠ²ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ»ΠΎ Π·Π°ΠΎΡΡΡΠ΅Π½ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΡ. Π ΡΠ°ΠΊΠΆΠ΅ Π±ΡΡΡΡΠΎ ΠΈΠ΄Π΅Ρ ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π΅Ρ Π±ΡΠ»Π° ΠΎΡΠΊΠ»ΠΎΠ½Π΅Π½Π°: Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π°ΡΠ°Π»Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° (ΠΠΏΡΠ΅Π»Ρ 2015) gevent Π½Π΅ Π±ΡΠ» ΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½ ΠΏΠΎΠ΄ ΡΡΠ΅ΡΡΡ Π²Π΅ΡΠΊΡ ΡΠ·ΡΠΊΠ° Python. Π₯ΠΎΡΡ, Π΅ΡΠ»ΠΈ Π±Ρ Π²ΡΠ΅ ΠΆΠ΅ ΠΎΠ½Π° Π±ΡΠ»Π° ΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π°, ΡΠΎ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» Π±Ρ ΠΈΠΌΠ΅Π½Π½ΠΎ Π΅Ρ, Π²Π·ΡΠ² ΠΏΡΠΈ ΡΡΠΎΠΌ Π΅ΡΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ gevent-websocket ΠΈ Π²ΡΠ΅ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ Π²ΡΠΉΡΠΈ ΠΎΡΠ΅Π½Ρ Π΄Π°ΠΆΠ΅ Π½Π΅ΠΏΠ»ΠΎΡ ΠΎ. ΠΠ° ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΡΡΠ°ΡΡΠΈ Π΄Π°Π½Π½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΡΡΠ΅ΡΡΠ΅ΠΉ Π²Π΅ΡΠΊΠΈ, Π½ΠΎ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡΡ Π½Π° Π½Π΅Π΅ ΡΠ΅ΠΉΡΠ°Ρ Ρ Π½Π΅ Π²ΠΈΠΆΡ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΡΠΌΡΡΠ»Π°.
Autobahn.ws β ΡΡΠΎ ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΠ½Π΅ ΡΠΆΠ΅ ΡΠ°Π½Π΅Π΅ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΠ»ΠΎΡΡ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡΠ°ΡΠ½ΠΎ ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡΡ ΠΏΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΡΠ²ΠΎΠΈΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΡ pet-ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² ΠΈ Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ Ρ ΠΌΠ΅Π½Ρ ΡΠΆΠ΅ ΠΈΠΌΠ΅Π΅ΡΡΡ Π½Π΅ΠΊΠΈΠΉ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΎΠΏΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ. ΠΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π½Π΅ΠΏΠ»ΠΎΡ ΠΎΠ΅ ΠΊΠΎΠΌΠΌΡΡΠ½ΠΈΡΠΈ, ΠΏΠ»ΡΡ Π°Π²ΡΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π²ΡΠ΅Π³Π΄Π° Π³ΠΎΡΠΎΠ² ΠΏΠΎΠΌΠΎΡΡ Π² ΡΠ»ΡΡΠ°Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΡΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠ³Π΄Π° Ρ ΠΌΠ΅Π½Ρ Π½Π΅ ΠΏΠΎΠ»ΡΡΠ°Π»ΠΎΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΡΡ Π΅Π΅ Ρ Twisted + wxPython, Π’ΠΎΠ±ΠΈΠ°Ρ ΠΎΡΠ΅Π½Ρ Ρ ΠΎΡΠΎΡΠΎ ΠΎΠ±ΡΡΡΠ½ΠΈΠ» ΠΌΠ½Π΅ ΠΊΠ°ΠΊ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ). ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡ Ρ asyncio, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΡ Π² ΡΡΠ΅Π±ΡΠ΅ΠΌΡΡ ΠΌΠ΅ΡΡΠ°Ρ . ΠΡΠΈΡΡΠ½ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΡ Π΅ΡΠ΅ Π±ΡΠ»ΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΡ RFC6455 ΠΈ Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²Ρ ΠΎΠ΄ΡΡΠΈΡ /ΠΈΡΡ ΠΎΠ΄ΡΡΠΈΡ Π΄Π°Π½Π½ΡΡ (ΠΏΠΎΡΡΡΠΏΠΈΠ»ΠΈ/ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Ρ Π»ΠΈ ΠΎΠ½ΠΈ Π² UTF-8 ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠ΅, ΡΡΠΎ Ρ ΡΡΠΈΡΠ°Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ). ΠΠΎΡΡΠΎΠΌΡ Π±ΡΠ»ΠΎ ΠΏΡΠΈΠ½ΡΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Π΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΡΠ½ΠΎΠ²Ρ Π΄Π»Ρ Π±ΡΠ΄ΡΡΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
4. ΠΡΠΎΠ±Π»Π΅ΠΌΡ, Π²ΠΎΠ·Π½ΠΈΠΊΡΠΈΠ΅ ΠΏΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅
ΠΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Ρ ΠΏΡΠΎΡΡΠΎ Π½Π΅ Π·Π½Π°Π» ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΡΡΡΠΏΠΈΡΡΡΡ ΠΊ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠ΄Π° Π·Π°Π΄Π°Ρ. ΠΠΎΡΠ»Π΅ Π½Π΅ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠ°Π·ΠΌΡΡΠ»Π΅Π½ΠΈΠΉ Ρ ΡΠ΅ΡΠΈΠ» ΠΏΡΠΎΡΡΠΎ ΠΈΠ΄ΡΠΈ ΠΏΡΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎ ΠΏΡΡΠΈ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΡΠ΅ΡΠ²Π΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π» Π±Ρ ΠΏΠΎΡΡΡΠΏΠΈΠ²ΡΠΈΠΉ Π·Π°ΠΏΡΠΎΡ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, Π²ΡΠΎΠ΄Π΅:
1) ΠΠΎΠ»ΡΡΠΈΠ»ΠΈ Π·Π°ΠΏΡΠΎΡ
2) ΠΡΠΎΠ²Π΅ΡΠΈΠ»ΠΈ ΡΡΠΎ ΠΏΡΠΈΡΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠΎΡΠΎΡΡΡ
ΡΡΠ°Π½Π΅Ρ ΠΏΠΎΠ½ΡΡΠ½ΠΎ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π·Π°ΠΏΡΠΎΡ (ΡΠΈΠΏ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΠΊΡΠ΄Π° ΠΎΠ±ΡΠ°ΡΠ°Π΅ΠΌΡΡ, ΠΈ Ρ.Π΄.)
3) ΠΡΠ΅ΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΏΠΎΡΡΡΠΏΠΈΠ²ΡΠ΅ΠΌΡ Π·Π°ΠΏΡΠΎΡΡ (ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΡΠΎΡΠΊΡ Π²Ρ
ΠΎΠ΄Π° ΠΈ ΠΌΠ΅ΡΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ). ΠΡΠ»ΠΈ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π½Π°ΡΠ»ΠΈ β Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΠΎΡΠΈΠ±ΠΊΡ. ΠΡΠ»ΠΈ ΠΆΠ΅ Π²ΡΠ΅ ΠΎΡΠ»ΠΈΡΠ½ΠΎ, ΡΠΎ Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΈ Π² Π½Π΅Π³ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ
4) Π‘ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΎΡΠ²Π΅Ρ ΠΏΡΠΈΠ²Π΅Π»ΠΈ ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡ ΡΠΎΡΠΌΠ°ΡΡ (JSON, XML, ΠΈ Ρ.Π΄.)
5) ΠΠ΅ΡΠ½ΡΠ»ΠΈ ΠΎΡΠ²Π΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡ
Π ΡΠ΅ΠΎΡΠΈΠΈ Π²ΡΠ΅ Π·Π²ΡΡΠΈΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ, Π½Π° Π΄Π΅Π»Π΅ Π²ΡΠ΅ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ Π²ΡΠ΅ Π² ΡΠΎΡΠ½ΠΎΡΡΠΈ Π½Π°ΠΎΠ±ΠΎΡΠΎΡ. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅, ΡΡΠΎ ΠΌΠ½Π΅ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΠ»ΠΎ Π² Π³ΠΎΠ»ΠΎΠ²Ρ, ΡΡΠΎ ΠΈΠ΄ΡΠΈ ΠΎΡ Π²ΡΡΠΎΠΊΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΠΈ ΠΊ Π½ΠΈΠΆΠ½ΠΈΠΌ. Π’ΠΎ Π΅ΡΡΡ Ρ ΡΠ΅Π» ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΡΠ°Π±ΠΎΡΠ°Π΅ΠΌ Ρ Autobahn.ws ΠΈ asyncio loop:
1) Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Β«ΡΠ°Π±ΡΠΈΠΊΠΈΒ», ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ asyncio loop ΠΈ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π²Ρ ΠΎΠ΄ΡΡΠΈΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°ΡΡ ΠΈΡ . ΠΠΎΡΠ»Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠ³ΠΎ Β«ΠΏΡΠΎΡΠ΅ΡΡΠ° ΡΡΠΊΠΎΠΏΠΎΠΆΠ°ΡΠΈΡΒ» ΠΌΡ Π³ΠΎΡΠΎΠ²Ρ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π·Π°ΠΏΡΠΎΡΡ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ.
2) ΠΠΎΠ»ΡΡΠΈΠ»ΠΈ Π·Π°ΠΏΡΠΎΡ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΡΠΎΡΠΌΠ°ΡΠ΅. Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π΅Π³ΠΎ Π² Π²ΠΈΠ΄Π΅ JSON ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
{
'method': 'POST',
'url': '/users/create',
'args': {
'token': 'aGFicmFoYWJyX2FkbWlu'
},
'data': {
'username': 'habrahabr',
'password': 'mysupersecretpassword',
}
}
ΠΡΠΎΡ JSON ΠΈΠΌΠ΅Π΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΡΡ ΡΡΡΡΠΊΡΡΡΡ. ΠΠ»ΠΈΠ΅Π½Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π°ΠΆΠ½ΡΡ Π΄Π»Ρ Π½Π°Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²:
- method β ΡΠΈΠΏ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π°Π΄ ΡΠ΅ΡΡΡΡΠΎΠΌ (ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΡΠΎΠΌΡ, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π² HTTP).
- url β ΠΏΡΡΡ ΠΊ ΡΠ΅ΡΡΡΡΡ, Ρ ΠΊΠΎΡΠΎΡΡΠΌ Ρ ΠΎΡΠΈΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ.
- args (ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ) β Π½Π°Π±ΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΠΎΡΡΡΠ»Π°Π΅ΠΌΡΡ ΡΠ΅ΡΠ²Π΅ΡΡ. ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π±Π»ΠΈΠ·ΠΊΠ°Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ ΡΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π² URL’Π΅ HTTP Π·Π°ΠΏΡΠΎΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ «?» ΠΈ «&» ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², Π²ΡΠΎΠ΄Π΅ Β«habrahabr.ru/?page=2&paginate_by=25Β». ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΡΠΏΠΈΡΠΎΠΊ Π³ΠΎΡΠΎΠ²ΡΡ Π΄Π°Π½Π½ΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠΌ Π½Π°Π΄ΠΎ Π½Π°Π·Π½Π°ΡΠΈΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ Π³ΡΡΠΏΠΏΡ) ΠΈΠ»ΠΈ ΠΏΡΠΎΡΡΠΎ Π½Π°Π±ΠΎΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ ΡΠΈΠ»ΡΡΡΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ° Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π·Π°ΠΏΡΠΎΡΠ°.
- data (ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ) β Π½Π°Π±ΠΎΡ Π΄Π°Π½Π½ΡΡ , ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΡΠ΅ΡΡΡΡΠΎΠΌ. Π ΡΠ΅Π»ΠΎΠΌ, ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΠΈΡΠ°ΡΡ, ΡΡΠΎ ΡΡΠΎ Π½Π΅ΠΊΠΈΠΉ Π°Π½Π°Π»ΠΎΠ³ ΡΠ΅Π»Ρ HTTP Π·Π°ΠΏΡΠΎΡΠ°.
- event_name (ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ) β Π½Π΅ΠΊΠΈΠΉ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡΡ ΠΎΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ endpoint’Π° Π²Π΅ΡΠ½ΡΠ»ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅.
ΠΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° Π·Π°ΠΏΡΠΎΡΡ Π±ΡΠ΄Π΅Ρ ΠΎΠΆΠΈΠ΄Π°ΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π½Π°Ρ ΡΠ΅ΡΠ²Π΅Ρ. ΠΡΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΈΠ· ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π½Π΅ΡΡ β Π³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎΠ± ΡΡΠΎΠΌ ΡΡΠ°Π·Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π°Π±ΡΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ method). Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΠ΄Π΅ΠΌ Π΄Π°Π»Π΅Π΅ ΠΏΠΎ Π½Π°ΡΠ΅ΠΌΡ ΡΠΏΠΈΡΠΊΡ.
3) ΠΡΠ°ΠΊ, Π·Π°ΠΏΡΠΎΡ Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ ΡΠ΅ΡΠ²Π΅ΡΡ, ΠΎΠ½ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΌ ΡΠΎΡΠΌΠ°ΡΠ΅ ΠΈ ΠΊΠΎΡΡΠ΅ΠΊΡΠ΅Π½. Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ Ρ ΠΎΡΠΈΠΌ Π΅Π³ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΈ Π²Π΅ΡΠ½ΡΡΡ ΠΎΡΠ²Π΅Ρ. ΠΠ΄Π½Π°ΠΊΠΎ, ΡΡΠΎ Π½Π°ΠΌ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ? Π‘ ΠΌΠΎΠ΅ΠΉ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ, Π½Π° ΠΏΠ΅ΡΠ²ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π½Π°Π»ΠΈΡΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠΎΡΡΠΈΠ½Π³Π°, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ΅ΠΉ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ URL ΡΡΠ΅Π±ΡΠ΅ΠΌΡΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ Π±Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π» ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΎΡΠ²Π΅Ρ, ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²ΡΠ²Π°Π» Π΅Π³ΠΎ Π² JSON, XML (ΠΈΠ»ΠΈ Π»ΡΠ±ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ ΡΠΎΡΠΌΠ°Ρ) ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π» Π΅Π³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡ.
Π ΡΡΠΎΠΌ ΠΏΡΠ½ΠΊΡΠ΅ Ρ ΠΎΡΡ Ρ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π°ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎΡΡΠΈΠ½Π³. ΠΡΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π²Π°ΠΆΠ½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π°ΠΌ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ Π±Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ Π΄ΠΎΡΡΡΠΏ ΠΏΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌΡ URL, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠ°ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΏΠΈΡΠΎΠΊ ΡΠ΅ΠΊΡΡΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ (Π²ΡΠΎΠ΄Π΅ «/users/»). Π‘ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π΄ΠΎΡΡΡΠΏ ΠΈ ΠΏΠΎ URL ΠΈΠΌΠ΅ΡΡΠΈΡ Π²ΠΈΠ΄ «/users//», ΠΏΠΎ ΠΊΠΎΡΠΎΡΡΠΌ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π΄Π΅ΡΠ°Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅. Π’ΠΎ Π΅ΡΡΡ ΡΠΎΡΡΠΈΠ½Π³ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΠΏΡΠΎΡΡΠΎΠΉ, ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ, Π° Π²ΡΠΎΡΠΎΠΉ β ΠΊΠ°ΠΊ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΠΏΡΡΠΈ ΠΊ ΡΠ΅ΡΡΡΡΡ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, ΠΌΠ΅Π½ΡΡΡΠΈΠΉΡΡ ΠΎΡ Π·Π°ΠΏΡΠΎΡΠ° ΠΊ Π·Π°ΠΏΡΠΎΡΡ.
ΠΠ»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠ³ΡΡ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ. ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΡΡ ΠΊ ΡΠ΅ΡΡΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
router = SimpleRouter()
router.register('/auth/login', LogIn, 'POST')
router.register('/users/{pk}', UserDetail, ['GET', 'PATCH'])
ΠΡ Π±ΡΠ΄Π΅ΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π°Π½Π°Π»ΠΈΠ· ΠΏΡΡΠΈ ΠΊ ΡΠ°ΠΊΠΎΠΌΡ ΡΠ΅ΡΡΡΡΡ. Π ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ endpoint, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π·Π°ΠΏΡΠΎΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ ΠΏΡΡΠΈ. ΠΠΎΠ³Π΄Π° ΠΏΡΠΈΠ΄Π΅Ρ Π·Π°ΠΏΡΠΎΡ Π½Π° ΡΡΠΎΡ ΡΠ΅ΡΡΡΡ, Π½Π°ΠΌ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΠΉΡΠΈΡΡ ΠΏΠΎ ΡΠ»ΠΎΠ²Π°ΡΡ, Π³Π΄Π΅ ΠΊΠ»ΡΡΠΎΠΌ Π±ΡΠ΄Π΅Ρ ΠΏΡΡΡ, Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ β ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ. Π ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΡΡ, Π² ΠΌΠΎΠΌΠ΅Π½Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ°, ΠΈ ΠΌΡ Π½Π°ΡΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅ΠΌΡΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ, ΡΠΎ Π±ΡΠ΄Π΅ΠΌ ΠΏΡΠΎΠ±ΡΠ°ΡΡΠ²Π°ΡΡ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Π½ΡΠΉ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π² ΠΌΠ΅ΡΡΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π·Π°ΠΏΡΠΎΡΠ°, ΡΡΠΎΠ±Ρ Π±ΡΠ»ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΠΎ ΠΊΠ»ΡΡΡ Π»ΠΈΠ±ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠ°ΠΊΡΡ-ΡΠΎ ΠΈΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°.
ΠΡ ΠΈ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΆΠ΅ ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ Π·Π°ΠΏΡΠΎΡ Π½Π° Π½Π΅ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ URL. ΠΠ»Ρ Π½Π΅Π³ΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π²Π΅ΡΠ½ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ.
4) ΠΠ΄ΠΎΡΠΎΠ²ΠΎ, ΡΠ΅ΠΏΠ΅ΡΡ ΠΊΠΎΠ΅ ΡΡΠΎ ΠΏΡΠΎΡΡΠ½ΠΈΠ»ΠΎΡΡ. Π£ΠΌΠ΅Π΅ΠΌ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡ ΡΡΠ΅Π±ΡΠ΅ΠΌΡΠ΅ ΠΏΡΡΠΈ, ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π΄Π»Ρ Π½ΠΈΡ , Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΅Π³ΡΠ»ΡΡΠΎΠΊ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡ ΠΈ ΠΏΡΠΎΠ±ΡΠ°ΡΡΠ²Π°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ (Π΄Π»Ρ ΡΠ»ΡΡΠ°Ρ Π΅ΡΠ»ΠΈ ΠΏΠΎΠΏΠ°Π»ΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΡΡ). ΠΠ°Π»Π΅Π΅ ΠΌΡ ΡΠΌΠΎΡΡΠΈΠΌ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ method, ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ Π² JSON ΠΈ ΡΡΠ°ΡΠ°Π΅ΠΌΡΡ Π½Π°ΠΉΡΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΊΠ»Π°ΡΡΠ° Ρ Π²ΡΡΡΠΊΠΈ. ΠΡΠ»ΠΈ ΠΎΠ½ ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ β Π³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎΠ± ΡΡΠΎΠΌ ΡΡΠ°Π·Ρ ΠΈ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ. Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π΄Π΅Π»Π°Π΅ΠΌ Π²ΡΠ·ΠΎΠ² ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΈ ΡΠΎΡΠΌΠΈΡΡΠ΅ΠΌ ΠΎΡΠ²Π΅Ρ.
5) ΠΠ°Π»Π΅Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ (Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ Π΄Π»Ρ ΡΠ»ΡΡΠ°Π΅Π² Ρ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌΠΈ) Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΡΠΌΠ°Ρ. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π²ΡΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΡΡΡ Π² JSON ΡΠΎΡΠΌΠ°Ρ.
6) ΠΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΎΡΠ²Π΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΏΠΎ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΡ.
Π Π²ΠΎΡ ΠΏΠΎ ΡΡΠΎΠΌΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎΠΌΡ ΠΏΠ»Π°Π½Ρ Ρ ΡΠ»Π΅Π΄ΠΎΠ²Π°Π» Π΄ΠΎ ΡΠ΅Π»ΠΈΠ·Π° 1.0. ΠΡΠ»ΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΠΈ Π²ΡΡΡΠΊΠΈ, ΡΠΈΡΡΠ΅ΠΌΡ ΡΠΎΡΡΠΈΠ½Π³Π° ΠΈ ΠΏΡΠΎΡΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π». Π₯ΠΎΡΡ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠ΅Π»ΠΈΠ·Π°, ΠΏΠΎ Ρ ΠΎΠ΄Ρ ΡΠ°Π·Π²ΠΈΡΠΈΡ ΡΡΠΎΠ³ΠΎ pet-ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΈΡΡ ΠΌΠΎΠ΄ΡΠ»ΠΈ Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΌΠΈ (Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ Π±ΡΠ» ΠΌΠΎΠ΄ΡΠ»Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΉ ΡΠΎΠΌΡ, ΡΡΠΎ Π΅ΡΡΡ Π² Django). ΠΠ»ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΎΠ»Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°Ρ ΠΌΠ½Π΅ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΏΡΠΈΠ²Π΅Π»Π° ΠΊ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ middleware ΠΈ JSON Web Token ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ. ΠΠ°ΠΊ ΠΈ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡ ΡΠ°Π½Π΅Π΅ β Π΄Π΅Π»Π°Π΅ΠΌ Π²ΡΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ, Π½Π΅ ΡΡΠ°ΡΠ°Π΅ΠΌΡΡ ΡΡΠ½ΡΡΡ ΡΡΠΎ-ΡΠΎ Π»ΠΈΡΠ½Π΅Π΅.
Π’Π°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°ΡΠ΅, Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ Β«ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ Π²Π΅Π»ΠΎΡΠΈΠΏΠ΅Π΄Π°Β» Π΄Π»Ρ ΠΌΠ΅Π½Ρ Π²ΡΠ»ΠΈΠ²Π°Π»ΠΎΡΡ Π² Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΡΠΈΠ»ΠΈΡ ΠΈ Π·Π°ΡΡΠ°ΡΡ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. Π₯ΠΎΡΡ, ΡΠ΅ΡΡΠ½ΠΎ Π³ΠΎΠ²ΠΎΡΡ, Ρ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ ΠΆΠ°Π»Π΅Ρ, ΡΡΠΎ ΠΏΠΎΡΠ΅Π» ΡΠ°ΠΊΠΈΠΌ ΠΏΡΡΠ΅ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΠ΅ΠΌΡ Π·Π°ΡΡΠ°ΡΠ΅Π½Π½ΠΎΠ΅ Π½Π° Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅, ΠΎΡΠ»Π°Π΄ΠΊΡ ΠΈ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΠ΅ Π΄ΠΎΠ΄Π΅Π»ΠΊΠΈ Π΄Π°Π΅Ρ ΠΎ ΡΠ΅Π±Π΅ Π·Π½Π°ΡΡ: ΡΠ΅ΠΉΡΠ°Ρ ΡΡΠ°Π» Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡΡΡΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ, ΠΊΠ°ΠΊ ΡΡΠΎ Π²ΠΎΠΎΠ±ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
ΠΡΠ»ΠΈ ΠΏΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° ΠΈ Π΅Π³ΠΎ ΠΎΡΠ»Π°Π΄ΠΊΠ° ΡΠ»Π° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π½Π΅ΠΏΠ»ΠΎΡ ΠΎ, ΡΠΎ ΠΏΡΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π²Π΅ΡΡΠΈΠΈ 1.1 Ρ ΠΏΡΠΎΡΡΠΎ Π½Π°Π΄ΠΎΠ»Π³ΠΎ ΠΏΠΎΠ²ΡΠ· Π² ΠΎΡΠ»Π°Π΄ΠΊΠ΅. ΠΠ°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π½Π΅ Π·Π°Π½ΠΈΠΌΠ°Π»ΠΎ ΡΡΠΎΠ»Ρ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠΈΡΠΊ ΠΈ Π΄Π΅ΡΠ°Π»ΡΠ½ΡΠΉ Π°Π½Π°Π»ΠΈΠ· ΡΠΎΠ³ΠΎ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
1) ΠΠ½Π°Π»ΠΈΠ· ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Ρ Django REST ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° Π½Π° ΠΏΡΠ΅Π΄ΠΌΠ΅Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΈ ΠΊΠ°ΠΊ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Β«ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡΠΎΠΌΒ»: ΡΡΠΎ Π΄Π΅Π»Π°Π΅ΠΌ ΠΊΠΎΠ³Π΄Π° Ρ ΠΎΡΠΈΠΌ Π·Π°ΠΏΠΈΡΠ°ΡΡ ΠΈΠ»ΠΈ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ; ΠΊΠΎΠ³Π΄Π° ΠΈ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌ, ΡΡΠΎ Π·Π° ΠΏΠΎΠ»Ρ Π±ΡΠ»ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½Ρ (ΠΈ ΠΈΠΌΠ΅ΡΡ Π»ΠΈ ΠΎΠ½ΠΈ Π²ΠΎΠΎΠ±ΡΠ΅ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ ΡΠ²ΡΠ·ΠΈ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΌΠΎΠ΄Π΅Π»ΡΠΌΠΈ) ΠΈ Π²ΠΎ ΡΡΠΎ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΈΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ/Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ.
2) Π‘Π΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ SQLAlchemy ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ Ρ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ Django REST ΠΊΠΎΠ΄ΠΎΠΌ ΠΈ Django ORM.
3) ΠΠΌΠ΅ΡΡ ΡΠ°ΠΊΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠΎΡΡΠΈΠ½Π³ΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΡΡΡ Π΄ΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠ΅ΡΠ΅Π· ΡΠΆΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠΉ API (ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΈ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ, ΠΈ Π·Π°ΠΏΠΈΡΠ°ΡΡ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΌ URL).
ΠΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΡΡΠΎΠΉ ΡΠ°ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π° ΠΌΠ½Π΅ Π²Π΅ΡΡΠΌΠ° ΡΠΈΠ»ΡΠ½ΠΎ ΠΏΠΎΠΌΠΎΠ³Π»ΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΡΠ΅ ΠΊΠΎΠ΄Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΊΠ°ΠΊ Django REST (ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ ΡΠ²Π»ΡΠ»Π°ΡΡ ΠΎΡΠ½ΠΎΠ²ΠΎΠΉ Π΄Π»Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠΈ), ΡΠ°ΠΊ ΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠΈ SQLAlchemy + marshmallow-sqlalchemy Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ ΠΏΠΎΠΌΠΎΠ³Π»ΠΈ Π²ΠΎΠΏΠ»ΠΎΡΠΈΡΡ Π²ΡΠ΅ Π·Π°Π΄ΡΠΌΠΊΠΈ Π² ΠΆΠΈΠ·Π½Ρ.
Π₯ΠΎΡΡ ΠΈ Π±ΡΠ»ΠΎ Π·Π°ΡΡΠ°ΡΠ΅Π½ΠΎ ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΡΡΠΎΠ², Π½ΠΎ ΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΠΏΡΠ°Π²Π΄Π°Π» Π²ΡΠ΅ Π·Π°ΡΡΠ°ΡΡ β ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΡ ΠΈΠΌΠ΅Π΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ SQLAlchemy ΡΠ°ΠΊ, ΠΊΠ°ΠΊ ΠΌΡ ΠΏΡΠΈΠ²ΡΠΊΠ»ΠΈ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ Π² Django REST. Π Π°Π±ΠΎΡΠ° Ρ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ ΠΈ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠ»ΡΠ½ΡΡ ΠΎΡΠ»ΠΈΡΠΈΠΉ. ΠΠ΄ΠΎΡΠΎΠ²ΠΎ, Π΄Π°ΠΆΠ΅ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠ΅ΡΠ΅ΡΡΠΈΠ²Π°ΡΡΡΡ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ: Π΄ΠΎΡΡΡΠΏΠ½ΡΠΉ API Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ΅Π½ ΡΠΎΠΌΡ, ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² Django REST.
5. Π’Π΅ΠΊΡΡΠ΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°
ΠΠ° ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ:
- Π ΠΎΡΡΠΈΠ½Π³
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° function- ΠΈ class-based Π²ΡΡΡΠ΅ΠΊ
- ΠΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΡΠ΅ΡΠ΅Π· JSON Web Token (Ρ ΠΎΡΡ ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΎ)
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠ°ΠΉΠ»Π° Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠ΅ΠΉ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ΡΠΎΠΉ, ΡΡΠΎ Π΅ΡΡΡ Π² Django Framework
- Π‘ΠΆΠ°ΡΠΈΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ (Π΅ΡΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ Π±ΡΠ°ΡΠ·Π΅ΡΠΎΠΌ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ Π½ΡΠΆΠ½ΠΎΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅)
- Π‘Π΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Django ΠΈ SQLAlchemy ORM
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° SSL
6. ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΊΡΠ°ΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄, Π³Π΄Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡΡ ΡΠ°Π±ΠΎΡΠ° Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌΠΈ ΠΈ email Π°Π΄ΡΠ΅ΡΠ°ΠΌΠΈ. ΠΠ°ΡΠ½Π΅ΠΌ ΡΠ°Π±Π»ΠΈΡ, ΠΎΠΏΠΈΡΠ°Π½Π½ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ SQLAlchemy ORM:
# -*- coding: utf-8 -*-
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship, validates
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50), unique=True)
fullname = Column(String(50), default='Unknown')
password = Column(String(512))
addresses = relationship("Address", back_populates="user")
@validates('name')
def validate_name(self, key, name):
assert '@' not in name
return name
def __repr__(self):
return "<User(name='%s', fullname='%s', password='%s')>" % (self.name, self.fullname, self.password)
class Address(Base):
__tablename__ = 'addresses'
id = Column(Integer, primary_key=True)
email_address = Column(String, nullable=False)
user_id = Column(Integer, ForeignKey('users.id'))
user = relationship("User", back_populates="addresses")
def __repr__(self):
return "<Address(email_address='%s')>" % self.email_address
Π’Π΅ΠΏΠ΅ΡΡ ΠΎΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡΡ Π΄Π»Ρ ΡΡΠΈΡ Π΄Π²ΡΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ:
# -*- coding: utf-8 -*-
from app.db import User, Address
from aiorest_ws.db.orm.sqlalchemy import serializers
from sqlalchemy.orm import Query
class AddressSerializer(serializers.ModelSerializer):
class Meta:
model = Address
fields = ('id', 'email_address')
class UserSerializer(serializers.ModelSerializer):
addresses = serializers.PrimaryKeyRelatedField(queryset=Query(Address), many=True, required=False)
class Meta:
model = User
ΠΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· ΡΡΠΏΠ΅Π»ΠΈ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, Π² ΠΌΠ΅ΡΡΠ΅, Π³Π΄Π΅ ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΠΊΠ»Π°ΡΡ Π΄Π»Ρ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, ΡΠΊΠ°Π·Π°Π½ΠΎ ΠΏΠΎΠ»Π΅ addresses, Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ queryset=Query(Address) Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅ ΠΊΠ»Π°ΡΡΠ° PrimaryKeyRelatedField. ΠΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡ Π΄Π»Ρ SQLAlchemy ORM ΠΌΠΎΠ³ Π²ΡΡΡΡΠΎΠΈΡΡ ΡΠ²ΡΠ·Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΠ»Π΅ΠΌ addresses ΠΈ ΡΠ°Π±Π»ΠΈΡΠ΅ΠΉ, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Ρ Π² ΡΡΠΎΡ ΠΊΠ»Π°ΡΡ ΠΏΡΠΈ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΡΠ΅ ΠΊΠ»ΡΡΠΈ. Π ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ ΡΡΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ QuerySet ΠΈΠ· Django ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°.
Π’Π΅ΠΏΠ΅ΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ Π²ΡΡΡΠΊΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠ΅ ΡΠ΅ΡΠ΅Π· Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΉ API ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ Π² ΡΡΠΈΡ ΡΠ°Π±Π»ΠΈΡΠ°Ρ :
# -*- coding: utf-8 -*-
from aiorest_ws.conf import settings
from aiorest_ws.db.orm.exceptions import ValidationError
from aiorest_ws.views import MethodBasedView
from app.db import User
from app.serializers import AddressSerializer, UserSerializer
class UserListView(MethodBasedView):
def get(self, request, *args, **kwargs):
session = settings.SQLALCHEMY_SESSION()
users = session.query(User).all()
data = UserSerializer(users, many=True).data
session.close()
return data
def post(self, request, *args, **kwargs):
if not request.data:
raise ValidationError('You must provide arguments for create.')
if not isinstance(request.data, list):
raise ValidationError('You must provide a list of objects.')
serializer = UserSerializer(data=request.data, many=True)
serializer.is_valid(raise_exception=True)
serializer.save()
return serializer.data
class UserView(MethodBasedView):
def get(self, request, id, *args, **kwargs):
session = settings.SQLALCHEMY_SESSION()
instance = session.query(User).filter(User.id == id).first()
data = UserSerializer(instance).data
session.close()
return data
def put(self, request, id, *args, **kwargs):
if not request.data:
raise ValidationError('You must provide an updated instance.')
session = settings.SQLALCHEMY_SESSION()
instance = session.query(User).filter(User.id == id).first()
if not instance:
raise ValidationError('Object does not exist.')
serializer = UserSerializer(instance, data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
session.close()
return serializer.data
class CreateUserView(MethodBasedView):
def post(self, request, *args, **kwargs):
serializer = UserSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return serializer.data
class AddressView(MethodBasedView):
def get(self, request, id, *args, **kwargs):
session = settings.SQLALCHEMY_SESSION()
instance = session.query(User).filter(User.id == id).first()
session.close()
return AddressSerializer(instance).data
class CreateAddressView(MethodBasedView):
def post(self, request, *args, **kwargs):
serializer = AddressSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
session.close()
return serializer.data
ΠΠ° ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΌΡ ΠΏΠΈΡΠ΅ΠΌ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ Π²ΡΡΡΠΊΠΈ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ ΡΠΎ ΡΠΏΠΈΡΠΊΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ². Π ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΡΠ°ΠΊΠΈΡ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠΎΠ², ΡΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½Π½ΡΡ ΠΎΡ MethodBasedView, ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ. ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π·Π°ΠΏΡΠΎΡΠ° (get/post/put/patch/ ΠΈ Ρ.ΠΏ.) ΠΏΠΈΡΠ΅ΡΡΡ ΡΠ²ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ.
ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌ ΡΠ°Π³ΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΡΡΠΎΠ³ΠΎ API, ΠΈ ΡΡΠΎΠ±Ρ ΠΎΠ½ Π±ΡΠ» Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π°ΠΌ ΠΈΠ·Π²Π½Π΅:
# -*- coding: utf-8 -*-
from aiorest_ws.routers import SimpleRouter
from app.views import UserListView, UserView, CreateUserView, AddressView, \
CreateAddressView
router = SimpleRouter()
router.register('/user/list', UserListView, 'GET')
router.register('/user/{id}', UserView, ['GET', 'PUT'], name='user-detail')
router.register('/user/', CreateUserView, ['POST'])
router.register('/address/{id}', AddressView, ['GET', 'PUT'], name='address-detail')
router.register('/address/', CreateAddressView, ['POST'])
ΠΠΎΠΎΠ±ΡΠ΅ΠΌ-ΡΠΎ Π·Π΄Π΅ΡΡ Π²ΡΠ΅ Π³ΠΎΡΠΎΠ²ΠΎ, ΠΎΡΡΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ΅ΡΠ²Π΅Ρ ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ ΡΠ΅ΡΠ΅Π· ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½Ρ (Python + Autobahn.ws, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ JavaScript, ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅, Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ). ΠΠ»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° Ρ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠΊΠ°ΠΆΡ ΠΏΠ°ΡΠΎΡΠΊΡ ΠΏΡΠΎΡΡΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Python + Authobahn.ws (ΠΎΠ³ΠΎΠ²ΠΎΡΡΡΡ Π·Π°ΡΠ°Π½Π΅Π΅, ΠΏΡΠΈΠΌΠ΅Ρ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ Π½Π΅ ΠΈΠ΄Π΅Π°Π»Π΅Π½, Π·Π΄Π΅ΡΡ Π·Π°Π΄Π°ΡΠ° ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ):
# -*- coding: utf-8 -*-
import asyncio
import json
from hashlib import sha256
from autobahn.asyncio.websocket import WebSocketClientProtocol, \
WebSocketClientFactory
def hash_password(password):
return sha256(password.encode('utf-8')).hexdigest()
class HelloClientProtocol(WebSocketClientProtocol):
def onOpen(self):
# Create new address
request = {
'method': 'POST',
'url': '/address/',
'data': {
"email_address": '[email protected]'
},
'event_name': 'create-address'
}
self.sendMessage(json.dumps(request).encode('utf8'))
# Get users list
request = {
'method': 'GET',
'url': '/user/list/',
'event_name': 'get-user-list'
}
self.sendMessage(json.dumps(request).encode('utf8'))
# Create new user with address
request = {
'method': 'POST',
'url': '/user/',
'data': {
'name': 'Neyton',
'fullname': 'Neyton Drake',
'password': hash_password('123456'),
'addresses': [{"id": 1}, ]
},
'event_name': 'create-user'
}
self.sendMessage(json.dumps(request).encode('utf8'))
# Trying to create new user with same info, but we have taken an error
self.sendMessage(json.dumps(request).encode('utf8'))
# Update existing object
request = {
'method': 'PUT',
'url': '/user/6/',
'data': {
'fullname': 'Definitely not Neyton Drake',
'addresses': [{"id": 1}, {"id": 2}]
},
'event_name': 'partial-update-user'
}
self.sendMessage(json.dumps(request).encode('utf8'))
def onMessage(self, payload, isBinary):
print("Result: {0}".format(payload.decode('utf8')))
if __name__ == '__main__':
factory = WebSocketClientFactory("ws://localhost:8080")
factory.protocol = HelloClientProtocol
loop = asyncio.get_event_loop()
coro = loop.create_connection(factory, '127.0.0.1', 8080)
loop.run_until_complete(coro)
loop.run_forever()
loop.close()
ΠΠΎΠ»Π΅Π΅ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π²Π΅ΡΡ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ Π·Π΄Π΅ΡΡ.
7. ΠΠ°Π»ΡΠ½Π΅ΠΉΡΠ΅Π΅ ΡΠ°Π·Π²ΠΈΡΠΈΠ΅
ΠΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅ΠΉ ΠΊΠ°ΠΊ ΡΠ°ΡΡΠΈΡΠΈΡΡ ΡΠ΅ΠΊΡΡΠΈΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π·Π²ΠΈΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ Π² ΡΠ»Π΅Π΄ΡΡΡΠΈΡ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡΡ :
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ
- ΠΡΠΎΡΠΌΠΎΡΡ ΡΠ΅ΡΠ΅Π· Π±ΡΠ°ΡΠ·Π΅Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΊ API (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π² Π²ΠΈΠ΄Π΅ ΠΏΠ»Π°Π³ΠΈΠ½Π° Π΄Π»Ρ Swagger)
- ΠΠΎΠ΄ΡΠ»ΠΈ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ API
- ΠΠ»ΠΈΠ΅Π½ΡΡ Π΄Π»Ρ Python ΠΈ JavaScript
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Pony ΠΈ Peewee ORM’ΠΎΠ²
ΠΠΏΡΡΡ ΠΆΠ΅ Π½Π°ΠΏΠΎΠΌΠ½Ρ, ΡΡΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΡΠΈΡΠΈ Π·Π°ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½Ρ Π½Π° ΡΠ°Π·Π½ΡΠ΅ ΡΠ΅Π»ΠΈΠ·Ρ, Π° Π½Π΅ Π½Π° ΠΎΠ΄ΠΈΠ½. Π‘Π΄Π΅Π»Π°Π½ΠΎ ΡΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ, ΡΡΠΎΠ±Ρ Π½Π΅ ΠΊΠΈΠ΄Π°ΡΡΡΡ ΠΈΠ· ΠΊΡΠ°ΠΉΠ½ΠΎΡΡΠΈ Π² ΠΊΡΠ°ΠΉΠ½ΠΎΡΡΡ, Π΄Π΅Π»Π°Ρ ΡΡΠΎ-ΡΠΎ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ, Π²Π΅Π΄Ρ ΠΏΠΎ ΠΈΡΠΎΠ³Ρ Π½ΠΈΡΠ΅Π³ΠΎ Π³ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΡΡΠΎΠ³ΠΎ Π½Π΅ Π²ΡΠΉΠ΄Π΅Ρ. Π ΠΌΠ½Π΅ ΠΏΡΠΎΡΠ΅, ΠΈ Π²Π°ΠΌ.
8. Π Π² Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ…
ΠΠ½Π΅ ΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π½Π΅ΠΏΠ»ΠΎΡ ΠΎ Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠ°Π·Π°, Π½Π΅ ΡΠΌΠΎΡΡΡ Π½Π° ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΎΠΏΡΡΠ° Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ. Π Π²Π½Π΅ΡΡΠΈ ΡΠ²ΠΎΠΉ Π²ΠΊΠ»Π°Π΄ (ΠΏΡΡΡΡ Π΄Π°ΠΆΠ΅ ΠΈ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ) Π² ΡΠ°Π·Π²ΠΈΡΠΈΠ΅ ΡΠ·ΡΠΊΠ° Python β Ρ ΠΎΡΠ΅ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠΈΠ»ΡΠ½ΠΎ. ΠΠ΅ ΡΠ΄ΠΈΠ²Π»ΡΠΉΡΠ΅ΡΡ ΡΠΎΠΌΡ, ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π±ΡΠ»ΠΎ Π½Π° ΡΡΠΎ Π±ΡΠ»ΠΎ Π·Π°ΡΡΠ°ΡΠ΅Π½ΠΎ: Π²ΡΠ΅ Π΄Π΅Π»Π°Π»ΠΎΡΡ (ΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ Π΄Π΅Π»Π°ΡΡΡΡ) Π² ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΈ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ ΠΏΠ΅ΡΠ΅ΡΡΠ²Π°ΠΌΠΈ (ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ΅Π³ΡΠ»ΡΡΠ½Π°Ρ ΡΠ°Π±ΠΎΡΠ° Ρ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠΌ ΠΎΡΠ΅Π½Ρ ΡΡΠΎΠΌΠ»ΡΠ΅Ρ, Π° ΡΠ°Π·Π²ΠΈΠ²Π°ΡΡΡΡ Ρ ΠΎΡΠ΅ΡΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ).
Π’Π°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°ΡΠ΅, Π±ΡΠ΄Ρ ΡΠ°Π΄ ΡΡΠ»ΡΡΠ°ΡΡ Π²ΡΠ΅ Π²Π°ΡΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΈΠ΄Π΅ΠΈ ΠΈ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ (ΠΈΠ»ΠΈ Π² Π²ΠΈΠ΄Π΅ ΠΏΡΠ» ΡΠ΅ΠΊΠ²Π΅ΡΡΠΎΠ² Ρ ΠΌΠ΅Π½Ρ Π½Π° GitHub). ΠΠ΅ ΡΡΠ΅ΡΠ½ΡΠΉΡΠ΅ΡΡ Π·Π°Π΄Π°Π²Π°ΡΡ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Π²ΠΎΠΏΡΠΎΡΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈ ΠΊΠ°ΠΊΠΈΡ -ΡΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠ΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ β Π±ΡΠ΄Ρ ΡΠ°Π΄ Π»ΡΠ±ΠΎΠΌΡ ΡΠΈΠ΄Π±Π΅ΠΊΡ.
ΠΠ΅ΡΡ Π²ΡΡΠ΅ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ ΠΊΠΎΠ΄, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ aiorest-ws, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° GitHub. ΠΡΠΈΠΌΠ΅ΡΡ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Ρ Π² ΠΊΠΎΡΠ½Π΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ examples. ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π·Π΄Π΅ΡΡ.
Spring WebSocket. How it works? / Π₯Π°Π±Ρ
ΠΠΎΠ±ΡΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΡΡΠΎΠΊ ΡΠ²Π°ΠΆΠ°Π΅ΠΌΡΠ΅ Ρ Π°Π±ΡΠ°Π²ΡΠ°Π½Π΅. ΠΠ° ΠΌΠΎΠ΅ΠΌ ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΌΠ΅ΡΡΠ΅ ΡΠ°Π±ΠΎΡΡ Π±ΡΠ»ΠΎ ΠΏΡΠΈΠ½ΡΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅Π²Π΅ΡΡΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ web ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ Π½Π° WebSocket. Π‘Π΅ΡΠ²Π΅ΡΠ½Π°Ρ ΡΠ°ΡΡΡ Π½Π°ΠΏΠΈΡΠ°Π½Π° Π½Π° Java Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° Spring. Π Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Ρ Ρ ΠΎΡΠ΅Π» ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π° Spring WebSocket.
WebSocket ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π΄Π²ΡΡΡΠΎΡΠΎΠ½Π½ΡΡ ΡΠ²ΡΠ·Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΎΠ΄Π½ΠΎ TCP ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅.
ΠΡΠΎΡΠΎΠΊΠΎΠ» ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π΄Π²ΡΡ ΡΠ°Π·:
ΠΠ»Ρ Handshake Π·Π°ΠΏΡΠΎΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ HTTP GET Π·Π°ΠΏΡΠΎΡ, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π΄ΠΎ WebSocket.
Π Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΠ²ΡΠ·ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, ΠΏΡΠΎΠΊΠ°ΡΠΊΠΎΠΉ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΊ WebSocket ΠΈ ΠΏΠ΅ΡΠ΅ΡΡΠ»ΠΊΠΎΠΉ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² Spring ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.
Π ΡΠ°Π·Π±ΠΎΡΠ΅ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Spring-WebSocket ΠΈ Annotation based ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°
ΠΡΠ°ΠΊ, Π΄Π»Ρ Π½Π°ΡΠ°Π»Π° Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±ΡΡΠ²ΠΈΡΡ ΡΠΎΡΠΊΡ Π΄ΠΎΡΡΡΠΏΠ°, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ Π΄Π°Π½Π½ΡΡ .
ΠΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ WebSocket Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ @EnableWebSocket. ΠΠ· ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ Π΄Π°Π½Π½ΠΎΠΉ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ WebSocketConfigurer Π½Π°ΡΠΈΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΌ ΠΊΠ»Π°ΡΡΠΎΠΌ. ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ WebSocketConfigurer ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ registerWebSocketHandlers(WebSocketHandlerRegistry registry). ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ Π²Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ WebSocketHandlerRegistry ΠΌΡ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² (WebSocketHandler) Π²Ρ ΠΎΠ΄ΡΡΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ url.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ°Π±ΠΎΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ @EnableWebSocket Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ.
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(DelegatingWebSocketConfiguration.class)
public @interface EnableWebSocket {
}
ΠΡΠ½ΠΎΠ²Π½Π°Ρ Π·Π°Π΄Π°ΡΠ° Π΄Π°Π½Π½ΠΎΠΉ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ β ΠΈΠΌΠΏΠΎΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° DelegatingWebSocketConfiguration, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ @Autowired ΠΏΠΎΠ»ΡΡΠΈΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° WebSocketConfigurer (Π½Π°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΠΊΠ»Π°ΡΡ). ΠΠ°Π½Π½ΡΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ WebSocketConfigurer ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π² ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅ WebSocketConfigurationSupport Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π±ΠΈΠ½Π° HandlerMapping.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±ΠΈΠ½Π° HandlerMapping Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΠΎΠ±Ρ Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ DispatcherServlet ΡΠΌΠΎΠ³ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ url.
ΠΠ»Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ WebSocketHandler Π² ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ HandlerMapping Π½Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΡΡΡΡ Π°Π΄Π°ΠΏΡΠ΅ΡΡ WebSocketHttpRequestHandler ΠΈ WebSocketHandlerMapping.
ΠΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ WebSocketHttpRequestHandler ΠΌΡ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅ΠΌ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ WebSocketHandler ΠΊ HttpRequestHandler. Π Π΄Π°Π»Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ²ΡΠ·ΠΊΡ url, Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΠΆΠ΄Π΅ΠΌ Π·Π°ΠΏΡΠΎΡΠ° ΠΏΠΎ ΠΎΡΠΊΡΡΡΠΈΡ WebSocket, ΠΈ HttpRequestHandler ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ WebSocketHandlerMapping, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈ Π±ΡΠ΄Π΅Ρ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½ Π² DispatcherServlet Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ HTTP Π·Π°ΠΏΡΠΎΡΠ°.
ΠΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΠΎΡΡΠ»Π°Π΅Ρ Π·Π°ΠΏΡΠΎΡ Π½Π° ΠΎΡΠΊΡΡΡΠΈΠ΅ WebSocket ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ, Π·Π°ΠΏΡΠΎΡ ΡΠ΅ΡΠ΅Π· DispatcherServlet ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΡ Π½Π° ΠΌΠ΅ΡΠΎΠ΄ handleRequest(HttpServletRequest servletRequest, HttpServletResponse servletResponse) Π½Π°ΡΠ΅Π³ΠΎ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠ° WebSocketHttpRequestHandler.
Π Π΄Π°Π½Π½ΠΎΠΌ ΠΌΠ΅ΡΠΎΠ΄Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π²ΡΠ·ΠΎΠ² Interceptors, ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΡΡ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅ ΠΏΡΠΈ Π·Π°Π΄Π°Π½ΠΈΠΈ WebSocketHandlers, ΠΈ Π²ΡΠ·ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄Π° doHandshake, Π΄Π΅ΡΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° HandshakeHandler.
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Handshake Π·Π°ΠΏΡΠΎΡΠ°
ΠΠ° ΡΠ°Π±ΠΎΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° doHandshake ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠΌΡΡ ΡΡΡΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅. ΠΠ΄Π΅ΡΡ ΠΈ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π²ΡΡ ΠΌΠ°Π³ΠΈΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΊ WebSockets. ΠΠΎ Π΄Π»Ρ Π½Π°ΡΠ°Π»Π° Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌΡΡ Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΎΡΠ²Π΅ΡΠ°.
Π’ΠΈΠΏΠΈΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
- Origin β ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ url, Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ Π·Π°ΠΏΡΠΎΡ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΡ Π°Π΄ΡΠ΅ΡΠΎΠ².
- Sec-WebSocket-Protocol β ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π½Π°Π±ΠΎΡ ΠΏΠΎΠ΄-ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ², ΠΊ ΠΏΡΠΈΠΌΠ΅ΡΡ, STOMP, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ Π² ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΡΠ°ΡΡΡΡ .
- Sec-WebSocket-Key β ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΉ ΠΊΠ»ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ Π±ΡΠ°ΡΠ·Π΅ΡΠΎΠΌ: 16 Π±Π°ΠΉΡ Π² ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠ΅ Base64.
- Sec-WebSocket-Version β Π²Π΅ΡΡΠΈΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°.
- Sec-WebSocket-Extensions β Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, permessage-deflate Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π±ΡΠ΄ΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π² ΡΠΆΠ°ΡΠΎΠΌ Π²ΠΈΠ΄Π΅.
Π’ΠΈΠΏΠΈΡΠ½ΡΠΉ ΠΎΡΠ²Π΅Ρ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ°:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
ΠΠΎΠ΄ ΠΎΡΠ²Π΅ΡΠ° HTTP 101 Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎΠ± ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°, Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π° WebSocket.
Sec-WebSocket-Accept β ΡΠ°ΡΡΡΠΈΡΠ°Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Sec-WebSocket-Key ΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ Β«258EAFA5-E914-47DA-95CA-C5AB0DC85B11Β» β ΠΏΠΎ ΡΡΡΠΈ ΡΡΠΎ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΎ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ ΠΈΠ½ΠΈΡΠΈΠΈΡΠΎΠ²Π°ΡΡ WebSocket ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅.
Π Π°Π±ΠΎΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° doHandshake ΠΌΠΎΠΆΠ½ΠΎ ΡΡ Π΅ΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ Π² ΡΠ°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅:
Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ° Π΄ΠΎ WebSocket
ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ
- TomcatRequestUpgradeStrategy
- JettyRequestUpgradeStrategy
- UndertowRequestUpgradeStrategy
- GlassFishRequestUpgradeStrategy
- WebLogicRequestUpgradeStrategy
- WebSphereRequestUpgradeStrategy
ΠΡΠΎΡΠ΅ΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ
ΡΠ°Π³ΠΎΠ²:
* ΠΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ EndPoint ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΏΡΡΠ΅ΠΌ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π½ΠΈΡ WebSocketHandler Π² StandardWebSocketHandlerAdapter, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π°ΡΠ»Π΅Π΄Π½ΠΈΠΊΠΎΠΌ EndPoint. ΠΠ»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ΅ΡΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ StandardWebSocketSession.
** ΠΠ»Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ HttpServletRequest ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° update, Π² ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ HttpUpgradeHandler,
Π² ΡΠ»ΡΡΠ°Π΅ ΡΠ°Π±ΠΎΡΡ Ρ Tomcat ΡΡΠΎ WsHttpUpgradeHandler. ΠΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° HttpUpgradeHandler ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ EndPonit Π² WebSocketContainer.
ΠΠΎΡΠ»Π΅ Π΄Π°Π½Π½ΡΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ Π½Π°ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ WebSocketHandler Π³ΠΎΡΠΎΠ²Π° ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π²Ρ ΠΎΠ΄ΡΡΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ WebSocketSession ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ.
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π±ΠΎΠ»ΡΡΠΎΠ΅ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅. Π ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΡΠ°ΡΡΡΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ°Π±ΠΎΡΡ fallback ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ SockJS ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΠΎΠ΄-ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° STOMP.
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΈ:
β The WebSocket Protocol
β Spring WebSocket
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π²Π΅Π±ΡΠΎΠΊΠ΅ΡΡ Π² ΡΠ²ΠΎΠ΅ΠΌ iOS ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ / Π₯Π°Π±Ρ
ΠΠΎΠ±ΡΡΠΉ Π΄Π΅Π½Ρ, ΡΠ²Π°ΠΆΠ°Π΅ΠΌΡΠ΅ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈ Π₯Π°Π±ΡΠ°Ρ Π°Π±ΡΠ°!
Π‘Π΅Π³ΠΎΠ΄Π½Ρ Ρ Ρ ΠΎΡΡ ΡΠ°ΡΡΠΊΠ°Π·Π°ΡΡ Π²Π°ΠΌ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΡΠΎΡΡΠΎ ΠΈ Π±ΡΡΡΡΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ Π²Π΅Π±ΡΠΎΠΊΠ΅ΡΡ Π² ΡΠ²ΠΎΠ΅ iOS ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΠ°ΡΠ° ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠΉ Π±ΠΈΡΠΆΠΈ ΠΊΡΠΈΠΏΡΠΎΠ²Π°Π»ΡΡ. Π Π΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ ΠΌΡ ΡΡΠΎ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΎΡΠΊΡΡΡΠΎΠ³ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΡ SocketRocket.
ΠΡΠΎΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡΡ Π΄Π»Ρ:
- Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°ΡΠ° Π² ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΠΎΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅ ΠΏΠΎΠ΄ iOS
- ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΡΠ°ΡΠ° Π΄Π»Ρ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ Π½Π΅ΠΉΡΠΎΠ½Π½ΡΡ ΡΠ΅ΡΠ΅ΠΉ
ΠΠ°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²Π°Π²ΡΠΈΡ ΡΡ ΠΏΡΠΎΡΡ ΠΏΠΎΠ΄ ΠΊΠ°Ρ!
ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ SocketRocket Π² ΠΏΡΠΎΠ΅ΠΊΡ
ΠΠ° Π³ΠΈΡΡ Π°Π±Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ, Ρ ΠΎΠΏΠΈΡΡ ΡΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΌ ΠΏΠΎΠ»ΡΠ·ΡΡΡΡ ΡΠ°ΠΌ.
- ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π² Π½Π°Ρ ΠΏΡΠΎΠ΅ΠΊΡ Π²ΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΈΠ· Π³ΡΡΠΏΠΏΡ Β«SocketRocketΒ»
- ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΈ Π² ΠΏΡΠΎΠ΅ΠΊΡ:
- libicucore.dylib
- CFNetwork.framework
- Security.framework
- Foundation.framework
- ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π² ΠΏΡΠΎΠ΅ΠΊΡ ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΡΠΈΠΊ HTML ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΠΎΡ Google (ΠΏΠΎΠ·ΠΆΠ΅ ΠΏΠΎΠΉΠΌΠ΅ΡΠ΅, Π·Π°ΡΠ΅ΠΌ)
ΠΠΈΡΠ΅Π³ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΠ³ΠΎ! ΠΡΠ΅ Π³ΠΎΡΠΎΠ²ΠΎ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠ΅ΠΉ ΠΌΠΎΡΠΈ Π²Π΅Π±ΡΠΎΠΊΠ΅ΡΠΎΠ².
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΡΠΎΠΊΠ΅ΡΡ
ΠΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠ°, Π΄Π΅Π΄ΡΠΊΡΠΈΠΈ ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΡΠ·ΡΠ²ΡΠΈΠ²ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π±ΠΈΡΠΆΡ, Ρ Π½Π°ΡΠΊΠ½ΡΠ»ΡΡ Π½Π° ΠΎΡΠΊΡΡΡΡΠΉ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ, ΠΎΡΠΊΡΠ΄Π° Π²ΡΡΠ²Π°Π» Π½ΡΠΆΠ½ΡΠΉ URL Π΄Π»Ρ ΡΠΎΠΊΠ΅ΡΠΎΠ² ΡΠ°ΡΠ°:
NSURL *url = [NSURL URLWithString:@"wss://ws.pusherapp.com/app/4e0ebd7a8b66fa3554a4?protocol=6&client=js&version=2.0.0&flash=false"];
Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ°ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΎΠΊΠ΅ΡΠ° Ρ Π½ΡΠΆΠ½ΡΠΌ Π·Π°ΠΏΡΠΎΡΠΎΠΌ, ΠΎΡΠΊΡΡΠ²Π°Π΅ΠΌ Π΅Π³ΠΎ ΠΈ Π΄Π΅Π»Π°Π΅ΠΌ ΡΠ΅Π±Ρ Π΄Π΅Π»Π΅Π³Π°ΡΠΎΠΌ:
NSURLRequest *request = [NSURLRequest requestWithURL:url];
SRWebSocket *rusSocket = [[SRWebSocket alloc] initWithURLRequest:request];
rusSocket.delegate = self;
[rusSocket open];
ΠΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΌΠ΅ΡΠΎΠ΄Π° setupSockets
- (void)setupSockets
{
NSURL *url = [NSURL URLWithString:@"wss://ws.pusherapp.com/app/4e0ebd7a8b66fa3554a4?protocol=6&client=js&version=2.0.0&flash=false"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
SRWebSocket *rusSocket = [[SRWebSocket alloc] initWithURLRequest:request];
rusSocket.delegate = self;
[rusSocket open];
}
ΠΠ΅ΡΠΎΠ΄Ρ SRWebSocketDelegate
Π ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ²Π°ΠΆΠ°ΡΡΠ΅ΠΌ ΡΠ΅Π±Ρ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ΅ ΠΏΠΎΠ΄ Objective-C ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π΄Π΅Π»Π΅Π³Π°ΡΡ β Π° Π² Π²Π΅Π±ΡΠΎΠΊΠ΅ΡΠ°Ρ ΠΈ ΠΏΠΎΠ΄Π°Π²Π½ΠΎ. ΠΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ Π΄Π²Π° ΠΌΠ΅ΡΠΎΠ΄Π° Π΄Π΅Π»Π΅Π³Π°ΡΠ° β ΠΏΠ΅ΡΠ²ΡΠΉ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΈ ΠΎΡΠΊΡΡΡΠΈΡ ΡΠΎΠΊΠ΅ΡΠ°, ΠΈ Π²ΡΠΎΡΠΎΠΉ, Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΠΉ ΠΏΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ.
- (void)webSocketDidOpen:(SRWebSocket *)webSocket
{
NSString *helloMsg = @"{\"event\":\"pusher:subscribe\",\"data\":{\"channel\":\"chat_ru\"}}";
[webSocket send:helloMsg];
}
ΠΠ΄Π΅ΡΡ Π²ΡΠ΅ ΠΏΡΠ΅Π΄Π΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ: ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠΊΠ΅ΡΡ ΠΎΡΠΊΡΡΠ²Π°ΡΡΡΡ, ΠΌΡ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΡ Π½Π° ΠΎΠΏΠΎΠ²Π΅ΡΠ΅Π½ΠΈΡ ΠΈΠ· ΡΡΡΡΠΊΠΎΠ³ΠΎ ΡΠ°ΡΠ°. ΠΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠΏΠΈΡΠ°ΡΡ ΠΈ Β«chat_enΒ».
ΠΠ°Π»ΡΡΠ΅ ΠΌΡ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΡ Π²Π΅Π±ΡΠΎΠΊΠ΅ΡΠ°:
- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message
{
message = [[message stringByReplacingOccurrencesOfString:@"///" withString:@""] stringByReplacingOccurrencesOfString:@"\\\\\\" withString:@""];
message = [message gtm_stringByUnescapingFromHTML];
}
ΠΠΏΡΡΡ ΠΆΠ΅, Π²ΡΠ΅ ΠΏΡΠΎΡΡΠΎ. Π ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΌΡ ΠΈΠ·Π±Π°Π²Π»ΡΠ΅ΠΌΡΡ ΠΎΡ ΠΌΡΡΠΎΡΠ°, Π²ΠΎ Π²ΡΠΎΡΠΎΠΉ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ ΠΎΡ Google Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ HTML ΡΠΈΠΌΠ²ΠΎΠ»Ρ Π² ΡΠΈΡΠ°Π΅ΠΌΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ. Message ΠΈ Π΅ΡΡΡ Π½Π°ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ β Π΄Π°Π»ΡΡΠ΅ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ°ΡΡΠΈΡΡ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ Π΄ΡΡΠ΅ ΡΠ³ΠΎΠ΄Π½ΠΎ.ΠΡΠΈΠΌΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ
{Β«eventΒ»:Β«msgΒ»,Β«dataΒ»:»\»{Β«uidΒ»:Β«467754Β»,Β«loginΒ»:Β«BTCalexxxΒ»,Β«msgΒ»:Β«anyone in for a short ltc pump to 15?Β»,Β«msg_idΒ»:12268748,Β«dateΒ»:Β«04.03.14 07:37:50Β»,Β«usr_clrΒ»:»#8da0b9″}\»»,Β«channelΒ»:Β«chat_enΒ»}
ΠΠ°ΠΊΡΡΠ²Π°Π΅ΠΌ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅
ΠΡΠ΅Π³Π΄Π° Π·Π°ΠΊΡΡΠ²Π°ΠΉΡΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ Π²Π°ΠΌ ΡΠΆΠ΅ Π½Π΅ Π½ΡΠΆΠ½ΠΎ! Π‘Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ:
[rusSocket close];
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠ³ΡΠΎΠΌΠ½ΠΎΠ΅ ΡΠΏΠ°ΡΠΈΠ±ΠΎ, ΡΡΠΎ Π΄ΠΎΡΠΈΡΠ°Π»ΠΈ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ°! ΠΠΎΡ ΡΠ°ΠΊΠΈΠΌ Π½Π΅Ρ ΠΈΡΡΡΠΌ ΠΌΠ΅ΡΠ΄ΠΎΠΌ Ρ Π½Π°Ρ Π½Π° Π»Π°Π΄ΠΎΠ½ΠΈ ΡΠ΅ΠΏΠ΅ΡΡ Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΠΌΠ΅ΡΡ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ°ΡΠ΅ Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π±ΠΈΡΠΆ ΠΊΡΠΈΠΏΡΠΎΠ²Π°Π»ΡΡ.
Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΠΎΠ³Ρ ΠΎΠΏΠΈΡΠ°ΡΡ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ²ΠΎΠΉ WhatsApp ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΎΡΠΊΡΡΡΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² Π·Π° 4-5 ΡΠ°ΡΠΎΠ² ΡΠ°Π±ΠΎΡΡ. ΠΠΎΠ½Π΅ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ Π²Π°ΠΌ, Π΄ΠΎΡΠΎΠ³ΠΈΠ΅ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈ, Π±ΡΠ΄Π΅Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ.
Nginx ΠΈ Websockets / Π₯Π°Π±Ρ
Π Nginx Π½Π°ΠΊΠΎΠ½Π΅Ρ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π΄ΠΎΠ»Π³ΠΎΠΆΠ΄Π°Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ ΠΏΠΎ ΠΏΡΠΎΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Websockets.
Π ΡΠ²ΡΠ·ΠΈ Ρ ΡΡΠΈΠΌ ΡΠΏΠ΅ΡΡ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³Π°ΠΌΠΈ ΠΈ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΡΠΌΠΈ.
ΠΠ»Ρ ΡΠ΅Ρ ΠΊΡΠΎ Π½Π΅ Π·Π½Π°Π», ΡΠ°Π½Π΅Π΅ ΠΏΡΠΎΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΡΠ»ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΡΠ΅Π· ΡΡΠΎΡΠΎΠ½Π½ΠΈΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ, Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΠΌΠΈ ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΈΡ Π½Π΅ ΡΡΡΡΠ°ΠΈΠ²Π°Π»ΠΈ. ΠΡ, Π΄Π° ΠΌΡ Π½Π΅ ΠΎΠ± ΡΡΠΎΠΌ.
Π’Π΅ΠΏΠ΅ΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠΊΡΠΈΡΠΎΠ²Π°ΡΡ http ΠΈ ws ΡΡΠ°ΡΡΠΈΠΊ, Π±ΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠΎΠ΄ ΠΎΠ΄Π½ΠΈΠΌ SSL ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠΌ, ΠΈ Π²ΡΠ΅ ΡΡΠΎ Ρ ΡΠΎΠ΄Π½ΡΠΌ Π·Π½Π°ΠΊΠΎΠΌΡΠΌ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠΎΠΌ.
Ws Π΄ΠΎΡΡΡΠΏΠ½Ρ Π½Π°ΡΠΈΠ½Π°Ρ Ρ Π²Π΅ΡΡΠΈΠΈ 1.3.13, Π° Π±ΡΠΊΠ²Π°Π»ΡΠ½ΠΎ ΡΠ΅Π³ΠΎΠ΄Π½Ρ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ Π΅ΡΠ΅ Π² ΠΌΠΎΠ΄ΡΠ»ΠΈ ngx_http_uwsgi_module ΠΈ ngx_http_scgi_module Π΄Π»Ρ 1.3.14
ΠΠΎΡ, ΡΡΠΎ Π³ΠΎΠ²ΠΎΡΠΈΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π½Π° ΡΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌΠ°.
ΠΠ»Ρ ΠΏΡΠ΅Π²ΡΠ°ΡΠ΅Π½ΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ ΠΈΠ· HTTP/1.1 Π² WebSocket ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΉ Π² HTTP/1.1 ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΡΠΌΠ΅Π½Ρ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°.
ΠΠΎ Π΅ΡΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ: ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ βUpgradeβ ΡΠ²Π»ΡΠ΅ΡΡΡ hop-by-hop Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ, ΡΠΎ ΠΎΠ½ Π½Π΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΊ ΠΏΡΠΎΠΊΡΠΈΡΡΠ΅ΠΌΠΎΠΌΡ ΡΠ΅ΡΠ²Π΅ΡΡ. ΠΡΠΈ ΠΏΡΡΠΌΠΎΠΌ ΠΏΡΠΎΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ CONNECT, ΡΡΠΎΠ±Ρ ΠΎΠ±ΠΎΠΉΡΠΈ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΡΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ ΠΏΡΠΎΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ Π½ΠΈΡΠ΅Π³ΠΎ ΠΎ ΠΏΡΠΎΠΊΡΠΈΡΡΡΡΠ΅ΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ΅ Π½Π΅ Π·Π½Π°Π΅Ρ, ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΡΠΎΠΊΡΠΈΡΡΡΡΠ΅ΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ΅.
ΠΠ°ΡΠΈΠ½Π°Ρ Ρ Π²Π΅ΡΡΠΈΠΈ 1.3.13, Π² nginx ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½ ΠΎΡΠΎΠ±ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ ΡΠ°Π±ΠΎΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΡΠ½Π½Π΅Π»Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈ ΠΏΡΠΎΠΊΡΠΈΡΡΠ΅ΠΌΡΠΌ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, Π΅ΡΠ»ΠΈ ΠΏΡΠΎΠΊΡΠΈΡΡΠ΅ΠΌΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ Π²Π΅ΡΠ½ΡΠ» ΠΎΡΠ²Π΅Ρ Ρ ΠΊΠΎΠ΄ΠΎΠΌ 101 (Switching Protocols), ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΠΎΠΏΡΠΎΡΠΈΠ» ΡΠΌΠ΅Π½ΠΈΡΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° βUpgradeβ Π² Π·Π°ΠΏΡΠΎΡΠ΅.
ΠΠ°ΠΊ ΡΠΆΠ΅ ΠΎΡΠΌΠ΅ΡΠ°Π»ΠΎΡΡ Π²ΡΡΠ΅, hop-by-hop Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ, Π²ΠΊΠ»ΡΡΠ°Ρ βUpgradeβ ΠΈ βConnectionβ, Π½Π΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΊ ΠΏΡΠΎΠΊΡΠΈΡΡΠ΅ΠΌΠΎΠΌΡ ΡΠ΅ΡΠ²Π΅ΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ, Π΄Π»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠΊΡΠΈΡΡΠ΅ΠΌΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ ΡΠ·Π½Π°Π» ΠΎ Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΡΠΌΠ΅Π½ΠΈΡΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» Π½Π° WebSocket, ΡΡΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠ²Π½ΠΎ:
ΠΠΎΠ½ΡΠΈΠ³.
ΠΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ:
location /ws/ {
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
ΠΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Ρ βConnectionβ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ Π·Π°ΠΏΡΠΎΡΠ° ΠΊ ΠΏΡΠΎΠΊΡΠΈΡΡΠ΅ΠΌΠΎΠΌΡ ΡΠ΅ΡΠ²Π΅ΡΡ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Π½Π°Π»ΠΈΡΠΈΡ ΠΏΠΎΠ»Ρ βUpgradeβ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ Π·Π°ΠΏΡΠΎΡΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°:
http {
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
...
location /ws/ {
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
Π Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠΉ, Π½ΠΎ Π²Π°ΠΆΠ½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΡΠΎ proxy_read_timeout, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΠΎΠΈΡ ΠΏΠΎ Π΄Π΅ΡΠΎΠ»ΡΡ Π² Π·Π½Π°ΡΠ΅Π½ΠΈΠΈ 60s, ΠΏΠΎ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΊΠΎΡΠΎΡΡΡ ΠΊΠΎΠ½Π½Π΅ΠΊΡ ΠΎΠ±ΡΡΠ²Π°Π΅ΡΡΡ, ΡΠ΅Π³ΠΎ Π² ΡΠ»ΡΡΠ°Π΅ ws ΠΎΠ±ΡΡΠ½ΠΎ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ.
ΠΠΎΡΡΠΎΠΌΡ, ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ:
http {
...
proxy_read_timeout 950s;
...
}
Π‘ΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ Π²Π°ΡΠ΅ΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½ΡΠΆΠ½Ρ Π±ΡΠ΄ΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΈΡΡΡ ΡΠ°ΠΉΠΌΠ°ΡΡΠ°, ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅ ΠΊΠΎΠΏΠΈΠΏΠ°ΡΡΠΈΡΠ΅ Π±Π΅Π·Π΄ΡΠΌΠ½ΠΎ;)
WebSocket | Chrome ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 4 | ΠΡΠ°ΠΉ ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12 | Firefox ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 11
| IE ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 10 | ΠΠΏΠ΅ΡΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12.1 | Safari ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 5 | WebView Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° β€37 | Chrome Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 18 | Firefox Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 14
| ΠΠΏΠ΅ΡΠ° Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12.1 | Safari iOS ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 4.2 | Samsung ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 1.0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
WebSocket () ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ | Chrome ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | ΠΡΠΎΠΌΠΊΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° β€79 | Firefox ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 7
| IE ? | ΠΠΏΠ΅ΡΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari ? | WebView Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Chrome Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Firefox Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 7 | ΠΠΏΠ΅ΡΠ° Android ? | Safari iOS ? | Samsung ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° |
Π΄Π²ΠΎΠΈΡΠ½ΡΠΉ Π’ΠΈΠΏ | Π₯ΡΠΎΠΌ ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | ΠΡΠΎΠΌΠΊΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12 | Firefox ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | IE ? | ΠΠΏΠ΅ΡΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | WebView Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Chrome Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Firefox Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Opera Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari iOS ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Samsung Internet Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° |
Ρ Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ | Π₯ΡΠΎΠΌ ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | ΠΡΠΎΠΌΠΊΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12 | Firefox ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | IE ? | ΠΠΏΠ΅ΡΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | WebView Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Chrome Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Firefox Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Opera Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari iOS ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Samsung Internet Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° |
Π·Π°ΠΊΡΡΡΡ | Π₯ΡΠΎΠΌ ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 4 | ΠΡΠ°ΠΉ ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12 | Firefox ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 8
| IE ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 10 | ΠΠΏΠ΅ΡΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12.1 | Safari ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 5 | WebView Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° β€37 | Chrome Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 18 | Firefox Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 8
| ΠΠΏΠ΅ΡΠ° Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12.1 | Safari iOS ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 4.2 | Samsung ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 1.0 |
Π·Π°ΠΊΡΡΡΡ ΡΠΎΠ±ΡΡΠΈΠ΅ | Chrome ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | ΠΡΠΎΠΌΠΊΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12 | Firefox ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | IE ? | ΠΠΏΠ΅ΡΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari ? | WebView Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Chrome Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Firefox Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Opera Android ? | Safari iOS ? | Samsung ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° |
ΠΎΡΠΈΠ±ΠΊΠ° ΡΠΎΠ±ΡΡΠΈΠ΅ | Chrome ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | ΠΡΠΎΠΌΠΊΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12 | Firefox ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | IE ? | ΠΠΏΠ΅ΡΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari ? | WebView Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Chrome Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Firefox Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Opera Android ? | Safari iOS ? | Samsung ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° |
Π½Π°ΡΠ°Π΄ΠΊΠΈ | Π₯ΡΠΎΠΌ ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | ΠΡΠΎΠΌΠΊΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12 | Firefox ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 8 | IE ? | ΠΠΏΠ΅ΡΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | WebView Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Chrome Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Firefox Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 8 | ΠΠΏΠ΅ΡΠ° Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari iOS ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Samsung Internet Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° |
ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ±ΡΡΠΈΠ΅ | Chrome ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | ΠΡΠΎΠΌΠΊΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12 | Firefox ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | IE ? | ΠΠΏΠ΅ΡΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari ? | WebView Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Chrome Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Firefox Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Opera Android ? | Safari iOS ? | Samsung ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° |
Π²ΠΊΠ». | Π₯ΡΠΎΠΌ ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | ΠΡΠΎΠΌΠΊΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12 | Firefox ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | IE ? | ΠΠΏΠ΅ΡΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | WebView Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Chrome Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Firefox Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Opera Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari iOS ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Samsung Internet Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° |
ΠΎΡΠΈΠ±ΠΊΠ° | Chrome ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | ΠΡΠΎΠΌΠΊΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12 | Firefox ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | IE ? | ΠΠΏΠ΅ΡΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | WebView Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Chrome Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Firefox Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Opera Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari iOS ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Samsung Internet Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° |
Π² ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΈ | Π₯ΡΠΎΠΌ ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | ΠΡΠΎΠΌΠΊΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12 | Firefox ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | IE ? | ΠΠΏΠ΅ΡΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | WebView Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Chrome Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Firefox Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Opera Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari iOS ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Samsung Internet Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° |
onopen | Chrome ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | ΠΡΠΎΠΌΠΊΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12 | Firefox ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | IE ? | ΠΠΏΠ΅ΡΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | WebView Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Chrome Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Firefox Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Opera Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari iOS ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Samsung Internet Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° |
ΠΎΡΠΊΡΡΡΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅ | Chrome ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | ΠΡΠΎΠΌΠΊΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12 | Firefox ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | IE ? | ΠΠΏΠ΅ΡΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari ? | WebView Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Chrome Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Firefox Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Opera Android ? | Safari iOS ? | Samsung ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° |
ΠΏΡΠΎΡΠΎΠΊΠΎΠ» | Π₯ΡΠΎΠΌ ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | ΠΡΠΎΠΌΠΊΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12 | Firefox ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | IE ? | ΠΠΏΠ΅ΡΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | WebView Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Chrome Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Firefox Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Opera Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari iOS ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Samsung Internet Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° |
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ RFC 6455 | Chrome ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 16 | ΠΡΠ°ΠΉ ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12 | Firefox ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 11 | IE ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 10 | ΠΠΏΠ΅ΡΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 15 | Safari ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 6 | WebView Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Chrome Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 18 | Firefox Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 14 | ΠΠΏΠ΅ΡΠ° Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 14 | Safari iOS ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 6 | Samsung ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 1.0 |
ΠΠΎΡΠΎΠ²ΠΎ Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ | Π₯ΡΠΎΠΌ ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 43 | ΠΡΠ°ΠΉ ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12 | Firefox ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 19 | IE ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 10 | ΠΠΏΠ΅ΡΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 30 | Safari ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 10 | WebView Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 43 | Chrome Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 43 | Firefox Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 19 | ΠΠΏΠ΅ΡΠ° Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 30 | Safari iOS ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 10 | Samsung ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 4.0 |
ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ | Π₯ΡΠΎΠΌ ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 4 | ΠΡΠ°ΠΉ ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12 | Firefox ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 18
| IE ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 10 | ΠΠΏΠ΅ΡΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12.1 | Safari ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 5 | WebView Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° β€37 | Chrome Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 18 | Firefox Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 18
| ΠΠΏΠ΅ΡΠ° Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12.1 | Safari iOS ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 4.2 | Samsung ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 1.0 |
url | Chrome ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | ΠΡΠΎΠΌΠΊΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 12 | Firefox ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | IE ? | ΠΠΏΠ΅ΡΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | WebView Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Chrome Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Firefox Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Opera Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Safari iOS ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Samsung Internet Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° |
Π Π½Π°Π»ΠΈΡΠΈΠΈ Ρ ΡΠ°Π±ΠΎΡΠΈΡ | Π₯ΡΠΎΠΌ ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | ΠΡΠΎΠΌΠΊΠ° ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° β€18 | Firefox ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 37 | IE ? | Opera ? | Safari ? | WebView Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Chrome Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° | Firefox Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° 37 | ΠΠΏΠ΅ΡΠ° Android ? | Safari iOS ? | Samsung ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ Android ΠΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΠ° |
.
HTML5 | ΠΠ΅Π±-ΡΠΎΠΊΠ΅ΡΡ
89
ΠΠ΅Π±-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ — HTML5 — ΠΠ΅Π±-ΡΠΎΠΊΠ΅ΡΡ
Π‘Π΅ΡΠ²Π΅ΡΠ½ΡΠ΅ ΡΠΎΠ±ΡΡΠΈΡ, ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΠ΅ ΡΠ°Π½Π΅Π΅, ΡΠ²Π»ΡΡΡΡΡ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Ρ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅ΡΠ°. ΠΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΠ²ΡΠ·Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΠ΄Π½ΠΎΡΡΠΎΡΠΎΠ½Π½Π΅ΠΉ. ΠΡΠ°ΡΠ·Π΅Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π²ΡΡΡΠΏΠ°ΡΡ Π² Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠΉ Π΄ΠΈΠ°Π»ΠΎΠ³ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ.
ΠΡΠ»ΠΈ Π²Ρ ΡΠΎΠ·Π΄Π°Π΅ΡΠ΅ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ΅ΡΡΠ΅Π·Π½ΠΎΠ΅ Π΄Π²ΡΡΡΠΎΡΠΎΠ½Π½Π΅Π΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, Π»ΡΡΡΠΈΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠΌ ΠΊ Π΅Π³ΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ (Π½Π΅ ΠΏΡΠΈΠ±Π΅Π³Π°Ρ ΠΊ ΠΏΠΎΠΌΠΎΡΠΈ Flash), Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ° XMLHttpRequest.Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΈΠΏΠ° ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΡΠΎΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ. ΠΠΎ Π·Π΄Π΅ΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΈ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌ.
ΠΡΠ΅ΠΆΠ΄Π΅ Π²ΡΠ΅Π³ΠΎ, ΠΎΠ±ΡΠ΅ΠΊΡ XMLHttpRequest Π½Π΅ ΠΎΡΠ΅Π½Ρ Ρ ΠΎΡΠΎΡΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ Π±ΡΡΡΡΠΎΠ³ΠΎ ΠΎΠ±ΠΌΠ΅Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΡΠ°ΡΠ΅). ΠΠΎΡΠΎΠΌ, Π² Π½Π΅ΠΌ Π½Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ²ΡΠ·Π°ΡΡ ΠΎΠ΄ΠΈΠ½ Π²ΡΠ·ΠΎΠ² Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π½ΠΎΠ²ΠΎΠΌ Π·Π°ΠΏΡΠΎΡΠ΅ ΠΎΡ Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡΡ ΡΠ΅ΡΠ²Π΅Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΡΠΈΡΠ»ΡΡΡ Ρ ΡΠ°ΠΌΠΎΠ³ΠΎ Π½Π°ΡΠ°Π»Π°, ΠΊΠΎΠΌΡ ΡΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ° ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ. ΠΠΎΡΡΠΎΠΌΡ ΡΡΠΎΠ²Π΅Π½Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΊΠΎΠ΄Π° Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΎΡ Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠ΅Π½Ρ Π±ΡΡΡΡΠΎ Π²ΡΡΠ°ΡΡΠΈ Π΄ΠΎ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌΠΎΠΉ.
ΠΠ»Ρ Π²ΡΠ΅Ρ ΡΡΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, Ρ ΠΎΡΡ ΠΎΠ½ΠΎ Π΅ΡΠ΅ Π½Π΅ Π²ΠΏΠΎΠ»Π½Π΅ Π³ΠΎΡΠΎΠ²ΠΎ. ΠΡΠΈΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠΎΠ² (Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠΎΠ²) , ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π±ΡΠ°ΡΠ·Π΅ΡΡ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΎΡΠΊΡΡΡΠΎΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠ΅ΡΡ ΠΈ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π»ΡΠ±ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
Π’Π΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠΎΠ² Π²ΡΠ·Π²Π°Π»Π° Π±ΠΎΠ»ΡΡΠΎΠ΅ Π²ΠΎΠ·Π±ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ Π² ΡΡΠ΅Π΄Π΅ Π²Π΅Π±-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², Π½ΠΎ ΠΎΠ½Π° Π΅ΡΠ΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ°Π·Π²ΠΈΡΠΈΡ, Ρ ΠΎΡΡ ΡΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ Π½Π΅ΠΏΠ»ΠΎΡ ΡΡ Π±ΡΠ°ΡΠ·Π΅ΡΠ½ΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ:
ΠΡΠ°ΡΠ·Π΅Ρ | IE | Firefox | Π₯ΡΠΎΠΌ | Safari | Opera | Safari iOS | Android |
ΠΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½Π°Ρ Π²Π΅ΡΡΠΈΡ | 10 | 6 | 14 | 6 | 12.1 | 6 | β |
ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π»ΡΡΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΡ, Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ Chrome, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ Π΄Π»Ρ Π½ΠΈΡ .
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠ°ΠΌ
ΠΠ΅Π±-ΡΠΎΠΊΠ΅ΡΡ ΡΠ²Π»ΡΡΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ. ΠΠ½ΠΈ Π°ΠΊΡΡΠ°Π»ΡΠ½Ρ Π΄Π»Ρ ΡΠ°ΠΊΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠ°ΠΊ ΡΠ°Ρ, ΠΌΠ°ΡΡΠΈΠ²Π½ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΠΈΠ³ΡΡ ΠΈΠ»ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΠΏΠΈΡΠΈΠ½Π³ΠΎΠ²ΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ. ΠΠ΅Π±-ΡΠΎΠΊΠ΅ΡΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ ΡΠΈΠΏΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π½ΠΎ ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π΄Π²ΠΈΠΆΠΈΠΌΡΡ JavaScript, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ»Π°.
Π Π΅ΡΠ΅Π½ΠΈΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠΎΠ² ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠΆΠ°ΡΠ½Ρ. Π Π°Π·ΡΠ°Π±ΠΎΡΠ°ΡΡ JavaScript-ΠΊΠΎΠ΄ Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΡ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎΠΉ Π½Π°Π΄Π΅ΠΆΠ½ΡΠΌ. ΠΠΎ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π²Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΡΡΡΡ Π±Π΅ΡΠ΅Π½ΡΠ΅ Π·Π½Π°Π½ΠΈΡ ΠΈ Π½Π°Π²ΡΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π²ΠΊΠ»ΡΡΠ°Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΎΠ² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΠΈ ΠΈ ΡΠ΅ΡΠ΅Π²ΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ.
ΠΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π²Π°ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΡΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ, ΠΊΠ°ΠΊ ΠΎΠΆΠΈΠ΄Π°Π΅ΡΡΡ, Π½Π°Π·ΡΠ²Π°ΡΡΡΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠΎΠ². ΠΠ° ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π²ΠΎΠ·Π»Π°Π³Π°Π΅ΡΡΡ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΡ Π·Π° ΠΊΠΎΠΎΡΠ΄ΠΈΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Π²ΡΠ΅Ρ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ², ΠΈ ΠΏΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ° ΠΎΠ½Π° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π±Π΅Π·ΠΎΡΡΠ°Π½ΠΎΠ²ΠΎΡΠ½ΠΎ.
ΠΠ½ΠΎΠ³ΠΈΠ΅ Ρ ΠΎΡΡΠΈΠ½Π³ΠΎΠ²ΡΠ΅ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Π½Π΅ Π΄ΠΎΠΏΡΡΠΊΠ°ΡΡ Π΄ΠΎΠ»Π³ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, Π΅ΡΠ»ΠΈ ΡΠΎΠ»ΡΠΊΠΎ Π²Ρ Π½Π΅ ΠΎΠΏΠ»Π°ΡΠΈΡΠ΅ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΡΠΉ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅Ρ, Ρ.Π΅. ΡΠ΅ΡΠ²Π΅Ρ, ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°ΡΡΠΈΠΉ Π»ΠΈΡΡ Π²Π°Ρ ΡΠ°ΠΉΡ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π²Π°Ρ ΠΎΠ±ΡΡΠ½ΡΠΉ ΠΎΠ±ΡΠΈΠΉ Ρ ΠΎΡΡΠΈΠ½Π³, Π²Ρ, ΡΠΊΠΎΡΠ΅Π΅, Π²ΡΠ΅Π³ΠΎ, Π½Π΅ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΠΉΡΠ΅ Π½Π° Π½Π΅ΠΌ ΡΡΡΠ°Π½ΠΈΡΡ, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΡ. ΠΠ°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π²Ρ ΡΠΌΡΠ΄ΡΠΈΡΠ΅ΡΡ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ΅ΡΠ²Π΅Ρ Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠΎΠ² ΠΈ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π΅Π³ΠΎ Π² ΡΠ°Π±ΠΎΡΠ΅ΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ, Π²Π»Π°Π΄Π΅Π»Π΅Ρ Π²Π°ΡΠ΅Π³ΠΎ Ρ ΠΎΡΡΠΈΠ½Π³Π°, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, Π²ΡΡΠ²ΠΈΡ ΠΈ Π²ΡΠΊΠ»ΡΡΠΈΡ Π΅Π³ΠΎ.
Π²Π°ΠΌ Π΄Π°ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ° Π²Π΅Π±-ΡΠΎΠΊΠ΅ΡΠΎΠ², ΡΠ°ΡΡΠΌΠΎΡΡΠΈΡΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· Π·Π°Π΄Π°Ρ
.