рдПрд▓рд┐рдХреНрд╕рд┐рд░ рдкрд░ рд╕рдмрд╕реЗ рд╕рд░рд▓ JSON RESTful API

рдПрд▓рдЖрдИрд╕реАрдЖрдИрдЖрд░ рдкрд░ JSON API рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП?


рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ:
рд▓реЗрдЦ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣реИрд▓реЛ, рд╡рд░реНрд▓реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ! рдПрд▓рд┐рдХреНрд╕рд┐рд░ рдкрд░ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдПрдкреАрдЖрдИ рдмрдирд╛рдиреЗ рдореЗрдВред
рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╕реЗ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдореВрдирд╛ рдХреЛрдб рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рд╣реИред
рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг рдирдореВрдирд╛ рдХреЛрдб GitHub рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред



рдирдИ рднрд╛рд╖рд╛ рдЪреБрдиреМрддрд┐рдпрд╛рдВ


рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд░реВрдмреА рдХреА рджреБрдирд┐рдпрд╛ рд╕реЗ рдЕрдореГрдд рдХреЗ рд▓рд┐рдП рдЖрддреЗ рд╣реИрдВ ред рдЙрдкрд▓рдмреНрдз рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдкрд░рд┐рдкрдХреНрд╡ рд╡рд╛рддрд╛рд╡рд░рдг рд╣реИред рдФрд░ рдЕрдореГрдд рдореЗрдВ рдХрднреА-рдХрднреА рдРрд╕реА рдкрд░рд┐рдкрдХреНрд╡рддрд╛ рдореЗрд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдЬрдм рдореБрдЭреЗ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреА рд╕реЗрд╡рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдПрдХ рдЙрдкрдпреБрдХреНрдд рдЦреЛрдЬ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:


  • рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдмрд╣реБрдд рджреБрд░реНрд▓рдн) рд╣реИ;
  • рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ, рд▓реЗрдХрд┐рди рдкреБрд░рд╛рдиреА рдпрд╛ рдЫреЛрдЯреА рдЧрд╛рдбрд╝реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ (рдХрднреА-рдХрднреА рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ);
  • рд╕рдореБрджрд╛рдп рд╕реЗ рдХрд┐рд╕реА рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ (рдХрднреА-рдХрднреА рд╕рдордп-рд╕рдордп рдкрд░);
  • рд╕рдореБрджрд╛рдп рд╕реЗ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ (рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛);
  • рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдХрд┐рд╕реА рдиреЗ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ (рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╡рд┐рдХрд▓реНрдк) рдХрд╛ рдЕрднрд╛рд╡ рд╣реИ;
  • рдЕрдкрдиреА рдЦреБрдж рдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ, рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЛ рдорд┐рд▓рд╛рдХрд░ ... (рдмрд╣реБрдд рдмрд╛рд░ рдкрд╛рдпрд╛ рдЧрдпрд╛)ред

рдПрд▓рд┐рдХреНрдЬрд┐рд░ рдкрд░ рд╕рд░рд▓ JSON рдПрдкреАрдЖрдИ



рдЖрдкрдХреЛ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд░реВрдмреА рд╣рдореЗрд╢рд╛ рд░реЗрд▓ рдкрд░ рдирд╣реАрдВ рд╣реИ ( рд░реВрдмреА рдСрди рд░реЗрд▓реНрд╕, рдпрд╛рдж рд░рдЦреЗрдВ? - рдЕрдиреБрд╡рд╛рджрдХ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ )ред рд╡реЗрдм рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рднреА рд╣рдореЗрд╢рд╛ рднрд╛рдЧ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЪрд▓реЛ рд╡реЗрдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред


рдЬрдм рдПрдХ рдПрдХрд▓ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ рдЖрдорддреМрд░ рдкрд░ рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддреЗ рд╣реИрдВ:



рдпреЗ рдЙрди рдФрдЬрд╛рд░реЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдореИрдВрдиреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рдореЗрд░реЗ рд╕рд╣рдХрд░реНрдореА рд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВ рд╕рд┐рдирд╛рддреНрд░рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ред рд╡реЗ рд╣рдирдореА рдХреА рдХреЛрд╢рд┐рд╢ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред рдореИрдВ рдХрд┐рд╕реА рднреА рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЪреБрди рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рдореБрдЭреЗ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдореЗрд░реЗ рд╡рд░реНрддрдорд╛рди рдореВрдб рдкрд░ рднреА рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред


рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВрдиреЗ рдПрд▓рд┐рдХреНрд╕рд┐рд░ рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╡рд┐рдХрд▓реНрдк рд╕реАрдорд┐рдд рдерд╛ред рдпрджреНрдпрдкрд┐ рдХрдИ рд╡реИрдХрд▓реНрдкрд┐рдХ "рдлреНрд░реЗрдорд╡рд░реНрдХ" рд╣реИрдВ (рдЬрд┐рдирдХреЗ рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдгреЛрдВ рдХреЗ рдирд╛рдо рдореИрдВ рдпрд╣рд╛рдВ рдирд╣реАрдВ рдмрддрд╛рдКрдВрдЧрд╛), рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реИ!


рдореИрдВрдиреЗ рд╕рд╛рд░рд╛ рджрд┐рди рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╣рд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЫрд╛рдБрдЯрдиреЗ рдореЗрдВ рдмрд┐рддрд╛рдпрд╛ред рд╕реНрд▓реИрдХ рдмреЙрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рд╣рд░реЛрдХреВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ HTTP2 рд╕рд░реНрд╡рд░ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рджрд┐рди рдХреЗ рдЕрдВрдд рддрдХ рдореИрдВрдиреЗ рд╣рд╛рд░ рдорд╛рди рд▓реАред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬреЛ рднреА рд╡рд┐рдХрд▓реНрдк рдореБрдЭреЗ рдорд┐рд▓реЗ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдмреБрдирд┐рдпрд╛рджреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдерд╛ред


рд╣рдореЗрд╢рд╛ рдПрдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ - рдлреАрдирд┐рдХреНрд╕


рдлреАрдирд┐рдХреНрд╕ рдореЗрд░рд╛ рдкрд╕рдВрджреАрджрд╛ рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдХрднреА-рдХрднреА рдпрд╣ рдмреЗрдорд╛рдиреА рд╣реИред рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдкреВрд░реА рд░реВрдкрд░реЗрдЦрд╛ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЦреАрдВрдЪ рд░рд╣рд╛ рдерд╛; рдФрд░ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред


рдореИрдВ рддреИрдпрд╛рд░-рдХрд┐рдП рдЧрдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рдерд╛, рдореИрдВрдиреЗ рдЬреЛ рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд╛рдП, рд╡реЗ рдореЗрд░реА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рдереЗ (рдмреЗрд╕рд┐рдХ рд░реВрдЯрд┐рдВрдЧ рдФрд░ JSON рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА), рдпрд╛ рд╣реЗрд░реЛрдХреВ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рдФрд░ рддреНрд╡рд░рд┐рдд рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рдереЗред рдПрдХ рдХрджрдо рдкреАрдЫреЗ рд╣рдЯреЛ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ред



рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдлреАрдирд┐рдХреНрд╕ рд╣реА рдХреБрдЫ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ , рд╣реИ рдирд╛?


рдкреНрд▓рдЧ рдПрдВрдб рдХрд╛рдЙрдмреЙрдп рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддреЗ рд╣реИрдВ


рдпрджрд┐ рдЖрдкрдХреЛ рд░реВрдмреА рдкрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдиреНрдпреВрдирддрд░ рд╕рд░реНрд╡рд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдмрд╕ rack рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд░реВрдмреА рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред


рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдЕрдореГрдд рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрддреНрд╡реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:


  • рдЪрд░рд╡рд╛рд╣рд╛ - рдПрд░реНрд▓рд╛рдВрдЧ / рдУрдЯреАрдкреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдФрд░ рддреЗрдЬрд╝ HTTP рд╕рд░реНрд╡рд░, рдЬреЛ рдкреВрд░реНрдг HTTP рд╕реНрдЯреИрдХ рдФрд░ рд░рд╛рдЙрдЯрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рд╡рд┐рд▓рдВрдмрддрд╛ рдФрд░ рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд;
  • рдкреНрд▓рдЧ - Erlang VM рдореЗрдВ рдЪрд▓ рд░рд╣реЗ рд╡рд┐рднрд┐рдиреНрди рд╡реЗрдм рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдбреЗрдкреНрдЯрд░ рдХрд╛ рдПрдХ рд╕реЗрдЯ; рдкреНрд░рддреНрдпреЗрдХ рдПрдбрд╛рдкреНрдЯрд░ рдЗрд╕рдХреЗ рдкреАрдЫреЗ рд╕реНрдерд┐рдд рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рд╕реАрдзрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ;
  • рдЬрд╣рд░ рдПрд▓рд┐рдХреНрд╕рд┐рд░ рдкрд░ JSON рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдореИрдВ рдПрдВрдбрдкреЙрдЗрдВрдЯ (рдПрдВрдбрдкреЙрдЗрдВрдЯ), рд░рд╛рдЙрдЯрд░ (рд░рд╛рдЙрдЯрд░) рдФрд░ JSON рдкрд╛рд░реНрд╕рд░ (JSON рд╣реИрдВрдбрд▓рд░) рдЬреИрд╕реЗ рдШрдЯрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рддрдм рдореИрдВ рд╣рд░реНрдХреЛрдХ рдкрд░ рдкрд░рд┐рдгрд╛рдореА рддреИрдирд╛рддреА рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдКрдВрдЧрд╛ред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЖрд╡реЗрджрди


рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреА рдЕрдореГрдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рд╢рд╛рдорд┐рд▓ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдВ:


 mix new minimal_server --sup 

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдорд┐рдХреНрд╕.рдХреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:


 def application do [ extra_applications: [:logger], mod: {MinimalServer.Application, []} ] end 

рдФрд░ рдлрд╝рд╛рдЗрд▓ lib/minimal_server/application.ex :


 defmodule MinimalServer.Application do use Application def start(_type, _args), do: Supervisor.start_link(children(), opts()) defp children do [] end defp opts do [ strategy: :one_for_one, name: MinimalServer.Supervisor ] end end 

рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ mix.exs рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:


 defp deps do [ {:poison, "~> 4.0"}, {:plug, "~> 1.7"}, {:cowboy, "~> 2.5"}, {:plug_cowboy, "~> 2.0"} ] end 

рдлрд┐рд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ:


 mix do deps.get, deps.compile, compile 

endpoint


рдЕрдм рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред рдЪрд▓реЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ lib/minimal_server/endpoint.ex рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ:


 defmodule MinimalServer.Endpoint do use Plug.Router plug(:match) plug(Plug.Parsers, parsers: [:json], pass: ["application/json"], json_decoder: Poison ) plug(:dispatch) match _ do send_resp(conn, 404, "Requested page not found!") end end 

Plug рдореЙрдбреНрдпреВрд▓ рдореЗрдВ Plug Plug.Router рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкрде рдФрд░ HTTP рд╡рд┐рдзрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИред рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░, рд░рд╛рдЙрдЯрд░ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ :match , match/2 рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рд░реНрдЧ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдореЙрдбреНрдпреВрд▓ рдкрд░ :dispatch , рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред


рдЪреВрдБрдХрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ API JSON-compliant рд╣реЛ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ Plug.Parsers рдХреЛ рд▓рд╛рдЧреВ Plug.Parsers ред рдЪреВрдВрдХрд┐ рдпрд╣ рджрд┐рдП рдЧрдП application/json рд╕рд╛рде application/json рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ :json_decoder , рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред


рдирддреАрдЬрддрди, рд╣рдордиреЗ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдорд╛рд░реНрдЧ "рдХреЛрдИ рднреА рдЕрдиреБрд░реЛрдз" рдмрдирд╛рдпрд╛ рдЬреЛ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдФрд░ HTTP (404) рдХреЛрдб рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред


рд░реВрдЯрд░


рд░рд╛рдЙрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдмрдирд╛рдиреЗ рдХрд╛ рдЕрдВрддрд┐рдо рдЪрд░рдг рд╣реЛрдЧрд╛ред рдпрд╣ рдкреВрд░реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рдЕрдВрддрд┐рдо рддрддреНрд╡ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдмрдирд╛рдпрд╛ рд╣реИ: рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЧрдарди рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдирд╛ред


рд░рд╛рдЙрдЯрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдХреБрдЫ рд╕рдВрджреЗрд╢ рд╡рд╛рдкрд╕ рднреЗрдЬ рджреЗрдЧрд╛ ( рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ lib/minimal_server/router.ex - рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рдиреЛрдЯ ):


 defmodule MinimalServer.Router do use Plug.Router plug(:match) plug(:dispatch) get "/" do conn |> put_resp_content_type("application/json") |> send_resp(200, Poison.encode!(message())) end defp message do %{ response_type: "in_channel", text: "Hello from BOT :)" } end end 

рдЙрдкрд░реЛрдХреНрдд Router рдореЙрдбреНрдпреВрд▓ рдореЗрдВ, рдЕрдиреБрд░реЛрдз рддрднреА рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдЗрд╕реЗ GET рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рднреЗрдЬрд╛ рдЧрдпрд╛ рд╣реЛ рдФрд░ / рдорд╛рд░реНрдЧ рдкрд░ рднреЗрдЬрд╛ рдЧрдпрд╛ рд╣реЛред рд░рд╛рдЙрдЯрд░ рдореЙрдбреНрдпреВрд▓ рдПрдХ Content-Type рд╣реЗрдбрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ application/json рдФрд░ рдмреЙрдбреА рд╣реЛрдЧреА:


 { "response_type": "in_channel", "text": "Hello from BOT :)" } 

рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛


рдЕрдм Endpoint рдореЙрдбреНрдпреВрд▓ рдХреЛ рд░рд╛рдЙрдЯрд░ рдХреЗ рдЖрдЧреЗ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдмрджрд▓рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдФрд░ Endpoint рдореЙрдбреНрдпреВрд▓ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Application рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реИред


рдкрд╣рд▓реЗ MinimalServer.Endpoint рд╕реЗ рдЬреЛрдбрд╝рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ [ match _ do ... end рд╕реЗ рдкрд╣рд▓реЗ match _ do ... end рдирд┐рдпрдо - рд▓рдЧрднрдЧред рдЕрдиреБрд╡рд╛рджрдХ ] рд╕реНрдЯреНрд░рд┐рдВрдЧ


 forward("/bot", to: MinimalServer.Router) 

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ /bot рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ Router рдореЙрдбреНрдпреВрд▓ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рджреВрд╕рд░реЗ start_link/1 endpoint.ex рдлрд╝рд╛рдЗрд▓ рдореЗрдВ child_spec/1 рдФрд░ start_link/1 рдЬреЛрдбрд╝рдХрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 defmodule MinimalServer.Endpoint do # ... def child_spec(opts) do %{ id: __MODULE__, start: {__MODULE__, :start_link, [opts]} } end def start_link(_opts), do: Plug.Cowboy.http(__MODULE__, []) end 

рдЕрдм рдЖрдк application.ex рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред MinimalServer.Endpoint рдХреЛ рдЬреЛрдбрд╝рдХрд░ рд╕реВрдЪреА children/0 рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛ рджреА рдЧрдИ рд╣реИред


 defmodule MinimalServer.Application do # ... defp children do [ MinimalServer.Endpoint ] end end 

рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдХрд░реЗрдВ:


 mix run --no-halt 

рдЕрдВрдд рдореЗрдВ рдЖрдк рдкрддрд╛ http: // localhost: 4000 / bot рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░рд╛ рд╕рдВрджреЗрд╢ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ :)


рддреИрдирд╛рддреА



config


рдЬреНрдпрд╛рджрд╛рддрд░, рдПрдХ рд╕реНрдерд╛рдиреАрдп рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдФрд░ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП, рд╕рд░реНрд╡рд░ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЛрдб рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдорд╛рд░реЗ config.exs рдХреЛ рдЬреЛрдбрд╝рдХрд░ config.exs рдХрд░реЗрдВ:


 config :minimal_server, MinimalServer.Endpoint, port: 4000 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рдЖрд╡реЗрджрди test , prod рдФрд░ dev рдореЛрдб рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкреЛрд░реНрдЯ 4000 рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдпреЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдирд╣реАрдВ рдмрджрд▓реА рдЬрд╛рддреА рд╣реИрдВред


рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдореВрд▓ рдкрд╛рда рдХрд╛ рд▓реЗрдЦрдХ рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ рдХрд┐ config.exs рдХреЛ рдХреИрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рдЖрдк рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, config/config.exs рдореЗрдВ рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдореЗрдВ import_config "#{Mix.env()}.exs" config/config.exs ; рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:


 use Mix.Config config :minimal_server, MinimalServer.Endpoint, port: 4000 import_config "#{Mix.env()}.exs" 

рдЙрд╕рдХреЗ рдмрд╛рдж, рдкреНрд░рддреНрдпреЗрдХ рд▓рд╛рдЗрди рдкрд░ рдлрд╛рдЗрд▓реНрд╕ prod.exs рдореЗрдВ рдлрд╛рдЗрд▓ prod.exs , test.exs , dev.exs :


 use Mix.Config 

рдЙрддреНрдкрд╛рджрди рдореЗрдВ, рд╣рдо рдЖрдорддреМрд░ рдкрд░ рдкреЛрд░реНрдЯ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рд┐рд╕реНрдЯрдо рд╡рд╛рддрд╛рд╡рд░рдг рдЪрд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ:


 config :minimal_server, MinimalServer.Endpoint, port: "PORT" |> System.get_env() |> String.to_integer() 

config/prod.exs рдХреЗ рдЕрдВрдд рддрдХ рдкрд╛рда рдЬреЛрдбрд╝реЗрдВ - рд▓рдЧрднрдЧред рдЕрдиреБрд╡рд╛рдж


рдЙрд╕рдХреЗ рдмрд╛рдж, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдкрд░рд┐рдЪрд╛рд▓рди рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ, рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХрд╛ рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рдиред


рдЖрдЗрдП рдЗрд╕ рдпреЛрдЬрдирд╛ рдХреЛ endpoint.ex рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, ( start_link / 1 рдлрд╝рдВрдХреНрд╢рди рдХреА рдЬрдЧрд╣ - рдЕрдиреБрд╡рд╛рджрдХ рдЯрд┐рдкреНрдкрдгреА ):


 defmodule MinimalServer.Endpoint do # ... require Logger def start_link(_opts) do with {:ok, [port: port] = config} <- Application.fetch_env(:minimal_server, __MODULE__) do Logger.info("Starting server at http://localhost:#{port}/") Plug.Adapters.Cowboy2.http(__MODULE__, [], config) end end end 

Heroku


рд╣реЗрд░реЛрдХреВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЬрдЯрд┐рд▓ рд╕реЗрдЯрдЕрдк рдХреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡рди-рдХреНрд▓рд┐рдХ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреБрдЫ рд╕рд░рд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдФрд░ рдПрдХ рджреВрд░рд╕реНрде рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред



рд╣рд░реЛрдХреВ рд╕реАрдПрд▓рдЖрдИ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж , рдЖрдк рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдПрдХ рдирдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:


 $ heroku create minimal-server-habr Creating тмв minimal-server-habr... done https://minimal-server-habr.herokuapp.com/ | https://git.heroku.com/minimal-server-habr.git 

рдЕрдм рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЕрдореГрдд тАЛтАЛрдмрд┐рд▓реНрдб рдХрд┐рдЯ рдЬреЛрдбрд╝реЗрдВ:


 heroku buildpacks:set \ https://github.com/HashNuke/heroku-buildpack-elixir.git 

рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд╕рдордп рдореЗрдВ, рдЕрдореГрдд рдФрд░ рдПрд░рд▓рдВрдЧ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг (рдкреНрд▓рд╕ рдпрд╛ рдорд╛рдЗрдирд╕) рд╣реИрдВ:


 erlang_version=21.1 elixir_version=1.8.1 

рдмрд┐рд▓реНрдб рдХрд┐рдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдКрдкрд░ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ elixir_buildpack.config рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред


рдПрдХ Procfile рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдЪрд░рдг рд╣реИ, рдФрд░, рдлрд┐рд░ рд╕реЗ, рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:


 web: mix run --no-halt 

рдЕрдиреБрд╡рд╛рджрдХ рдХрд╛ рдиреЛрдЯ: рд╣рд░реЛрдХреВ рдкрд░ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХрд╛ рдорд╛рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:


 $ heroku config:set PORT=4000 Setting PORT and restarting тмв minimal-server-habr... done, v5 PORT: 4000 

рдЬреИрд╕реЗ рд╣реА рдЖрдк рдирдИ рдлрд╛рдЗрд▓ рдХрд░рддреЗ рд╣реИрдВ [ git - рд▓рдЧрднрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред рдЕрдиреБрд╡рд╛рджрдХ ], рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╣рд░реЛрдХреВ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 $ git push heroku master Initializing repository, done. updating 'refs/heads/master' ... 

рдФрд░ рд╡рд╣ рд╕рдм рд╣реИ! рдЖрд╡реЗрджрди https://minimal-server-habr.herokuapp.com рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред


рд╕рд╛рд░рд╛рдВрд╢


рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдордЭ рдЧрдП рдереЗ рдХрд┐ рдПрд▓рд┐рдХреНрд╕рд┐рд░ рдХреЛ рд╕рд░рд▓рддрдо JSON рд░реЗрд╕реНрдЯрдлреБрд▓ рдПрдкреАрдЖрдИ рдФрд░ HTTP рд╕рд░реНрд╡рд░ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП , рдХреЗрд╡рд▓ 3 ( 4 - рд▓рдЧрднрдЧред рдЯреНрд░рд╛рдВрд╕рд▓реЗрдЯрд░ ) рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ред


рдЬрдм рдЖрдкрдХреЛ рд╕рд░рд▓ рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╣рд░ рдмрд╛рд░ рдлреАрдирд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЪрд╛рд╣реЗ рд╡рд╣ рдХрд┐рддрдирд╛ рднреА рдЕрдЪреНрдЫрд╛ рд╣реЛ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХреЛрдИ рдЕрдиреНрдп рдврд╛рдВрдЪрд╛ рднреАред


рдЙрддреНрд╕реБрдХ рдХреНрдпреЛрдВ plug + cowboy рдФрд░ рдлреАрдирд┐рдХреНрд╕ рдХреЗ рдмреАрдЪ рдХрд╣реАрдВ рднреА рдХреЛрдИ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдФрд░ рд╕рдорд░реНрдерд┐рдд рд░реВрдкрд░реЗрдЦрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ? рд╢рд╛рдпрдж рд╕рд░рд▓ рдЪреАрдЬреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ? рд╢рд╛рдпрдж рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдкрдиреА рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ? рдпрд╛ рд╢рд╛рдпрдж рд╣рд░ рдХреЛрдИ рдлреАрдирд┐рдХреНрд╕ рдпрд╛ рдкреНрд░рд╕реНрддреБрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ?



рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА , рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдореЗрд░реЗ GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред

Source: https://habr.com/ru/post/hi444554/


All Articles