рдЬреВрд▓рд┐рдпрд╛ред рд╡реЗрдм рд╕реЗрд╡рд╛рдПрдБ


рд╣рдо рддрдХрдиреАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рдФрд░ рдЖрдЬ рд╣рдо рд╡реЗрдм рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдХреЛрдИ рд░рд╣рд╕реНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬреВрд▓рд┐рдпрд╛ рднрд╛рд╖рд╛ рдХрд╛ рдореБрдЦреНрдп рдЖрд▓рд╛ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдХрд╛рдлреА рддрд╛рд░реНрдХрд┐рдХ рдХрджрдо рд╡реЗрдм рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рд╕реАрдзреЗ рдорд╛рдВрдЧ рдкрд░ рдЗрди рдЧрдгрдирд╛рдУрдВ рдХреЛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рдирд╛ рд╣реИред рдмреЗрд╢рдХ, рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рд╡рд╛рд▓реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди, рдЪреВрдВрдХрд┐ рд╡реЗ рдЕрдм рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд╣рдо рдЙрди рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдЬреЛ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕реЗрд╡рд╛ рдХрд░рддреЗ рд╣реИрдВред


рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рдпреБрд╡рд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг, рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдкреИрдХреЗрдЬ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдФрд░ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рд╣реИред рд╕рд╛рде рд╣реА, рд╣рдо рдЙрдирдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ рд╕рдорд╛рди JSON рд╡реЗрдм рд╕реЗрд╡рд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВред


рдЬреВрд▓рд┐рдпрд╛ рдХрд╛ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪрд╛ рдкрд┐рдЫрд▓реЗ рджреЛ рд╕рд╛рд▓ рдореЗрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реБрдЖ рд╣реИред рдФрд░, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдХреЗрд╡рд▓ рдкрд╛рда рдХреА рдПрдХ рд╕реБрдВрджрд░ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдЦреБрджрд╛ рд╣реБрдЖ рдПрдХ рдСрди-рд▓рд╛рдЗрди рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕ рддрдереНрдп рдкрд░ рдЬреЛрд░ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рддреАрд╡реНрд░рддрд╛ рд╕реЗ рдмрджрд▓ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЬреЛ рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдерд╛ рд╡рд╣ рдЕрдм рдкреБрд░рд╛рдирд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рд╕реНрдерд┐рд░ рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдФрд░ рдЙрдирдХреА рдорджрдж рд╕реЗ рд╡реЗрдм рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рджреЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╡реЗрдм рд╕реЗрд╡рд╛ рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ JSON рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде POST рдЕрдиреБрд░реЛрдз рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИ:


{ "title": "something", "body": "something" } 

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


HTTP.jl рдкреИрдХреЗрдЬ


рдпрд╣ рдкреИрдХреЗрдЬ рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ HTTP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдФрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реИред HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдкреИрдХреЗрдЬ HTTP рд╕рд░реНрд╡рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдкреИрдХреЗрдЬ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, WebSocket рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд░реНрдерди рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкрд╣рд▓реЗ рдПрдХ рдЕрд▓рдЧ рдкреИрдХреЗрдЬ WebSocket.jl рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣реА рд╣реИ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ, HTTP.jl, рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рдЕрдзрд┐рдХрд╛рдВрд╢ рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред


HTTP рдХреНрд▓рд╛рдЗрдВрдЯ


рд╣рдо рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред


 #!/usr/bin/env julia --project=@. import HTTP import JSON.json const PORT = "8080" const HOST = "127.0.0.1" const NAME = "Jemand" #    struct Document title::String body::String end #         Base.show(r::HTTP.Messages.Response) = println(r.status == 200 ? String(r.body) : "Error: " * r.status) #    r = HTTP.get("http://$(HOST):$(PORT)") show(r) #   /user/:name r = HTTP.get("http://$(HOST):$(PORT)/user/$(NAME)"; verbose=1) show(r) #  JSON- POST- doc = Document("Some document", "Test document with some content.") r = HTTP.post( "http://$(HOST):$(PORT)/resource/process", [("Content-Type" => "application/json")], json(doc); verbose=3) show(r) 

HTTP рдкреИрдХреЗрдЬ рдРрд╕реЗ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ HTTP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрдорд╛рдВрдб рдХреЗ рдирд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо get рдХрд░рддреЗ get рдФрд░ post ред рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд╛рдо рдХрд╛ рддрд░реНрдХ verbose рдЖрдкрдХреЛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рддреЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, verbose=1 рдХрд╛ рдЙрддреНрдкрд╛рджрди рд╣реЛрдЧрд╛:


 GET /user/Jemand HTTP/1.1 HTTP/1.1 200 OK <= (GET /user/Jemand HTTP/1.1) 

рдФрд░ verbose=3 рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ verbose=3 рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░реЗрд╖рд┐рдд рдФрд░ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рд╕реЗрдЯ рдорд┐рд▓рддрд╛ рд╣реИ:


 DEBUG: 2019-04-21T22:40:40.961 eb4f я╕П-> "POST /resource/process HTTP/1.1\r\n" (write) DEBUG: 2019-04-21T22:40:40.961 eb4f я╕П-> "Content-Type: application/json\r\n" (write) DEBUG: 2019-04-21T22:40:40.961 eb4f я╕П-> "Host: 127.0.0.1\r\n" (write) DEBUG: 2019-04-21T22:40:40.961 eb4f я╕П-> "Content-Length: 67\r\n" (write) DEBUG: 2019-04-21T22:40:40.961 eb4f я╕П-> "\r\n" (write) DEBUG: 2019-04-21T22:40:40.961 e1c6 я╕П-> "{\"title\":\"Some document\",\"body\":\"Test document with some content.\"}" (unsafe_write) DEBUG: 2019-04-21T22:40:40.963 eb4f я╕П<- "HTTP/1.1 200 OK\r\n" (readuntil) DEBUG: "Content-Type: application/json\r\n" DEBUG: "Transfer-Encoding: chunked\r\n" DEBUG: "\r\n" DEBUG: 2019-04-21T22:40:40.963 eb4f я╕П<- "5d\r\n" (readuntil) DEBUG: 2019-04-21T22:40:40.963 eb4f я╕П<- "{\"body\":\"Test document with some content.\",\"server_mark\":\"confirmed\",\"title\":\"Some document\"}" (unsafe_read) DEBUG: 2019-04-21T22:40:40.968 eb4f я╕П<- "\r\n" (readuntil) DEBUG: "0\r\n" DEBUG: 2019-04-21T22:40:40.968 eb4f я╕П<- "\r\n" (readuntil) 

рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ verbose=1 рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдЬреЛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЗрд╡рд▓ рдиреНрдпреВрдирддрдо рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдПред


рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВред


 doc = Document("Some document", "Test document with some content.") 

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


 r = HTTP.post( "http://$(HOST):$(PORT)/resource/process", [("Content-Type" => "application/json")], json(doc); verbose=3) 

рдЪреВрдВрдХрд┐ рд╣рдо JSON рдкрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ Content-Type рд╣реЗрдбрд░ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ application/json рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╢реАрд░реНрд╖ рд▓реЗрдЦреЛрдВ рдХреЛ HTTP.post рд╡рд┐рдзрд┐ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдиреНрдп рд╕рднреА рдХреА рддрд░рд╣) рдореЗрдВ рд╕рд░рдгреА (рдкреНрд░рдХрд╛рд░ рд╡реЗрдХреНрдЯрд░, рд▓реЗрдХрд┐рди HTTP.post ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реЗрдбрд░ - рд╡реИрд▓реНрдпреВ рдЬреЛрдбрд╝реЗ рд╡рд╛рд▓реЗ рдкрд╛рд╕ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред


рд╕реНрд╡рд╛рд╕реНрдереНрдп рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рддреАрди рдкреНрд░рд╢реНрди рдХрд░реЗрдВрдЧреЗ:


  • рд░реВрдЯ рд░реВрдЯ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ;
  • рдкреНрд░рд╛рд░реВрдк / рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ / рдирд╛рдо рдореЗрдВ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдЬрд╣рд╛рдВ рдирд╛рдо рдкреНрд░реЗрд╖рд┐рдд рдирд╛рдо рд╣реИ;
  • JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде POST рдЕрдиреБрд░реЛрдз / рд╕рдВрд╕рд╛рдзрди / рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд╛рд░рд┐рдд рд╣реБрдИред рд╣рдо рдПрдХ рд╣реА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди server_mark рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред

рд╣рдо рд╕рднреА рд╕рд░реНрд╡рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред


HTTP рд╕рд░реНрд╡рд░


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


 #!/usr/bin/env julia --project=@. import Sockets import HTTP import JSON #    #    index(req::HTTP.Request) = HTTP.Response(200, "Hello World") #     function welcome_user(req::HTTP.Request) # dump(req) user = "" if (m = match( r".*/user/([[:alpha:]]+)", req.target)) != nothing user = m[1] end return HTTP.Response(200, "Hello " * user) end #  JSON function process_resource(req::HTTP.Request) # dump(req) message = JSON.parse(String(req.body)) @info message message["server_mark"] = "confirmed" return HTTP.Response(200, JSON.json(message)) end #      const ROUTER = HTTP.Router() HTTP.@register(ROUTER, "GET", "/", index) HTTP.@register(ROUTER, "GET", "/user/*", welcome_user) HTTP.@register(ROUTER, "POST", "/resource/process", process_resource) HTTP.serve(ROUTER, Sockets.localhost, 8080) 

рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП:


 dump(req) 

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


рдкрдВрдХреНрддрд┐


 (m = match( r".*/user/([[:alpha:]]+)", req.target)) 

рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ рдЬреЛ рдЙрд╕ рдорд╛рд░реНрдЧ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреА рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╣реИрдВрдбрд▓рд░ рдкрдВрдЬреАрдХреГрдд рд╣реИред HTTP.jl рдкреИрдХреЗрдЬ рдПрдХ рдорд╛рд░реНрдЧ рдореЗрдВ рдПрдХ рдкреИрдЯрд░реНрди рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдирд╣реАрдВ HTTP.jl ред


process_resource рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЕрдВрджрд░, рд╣рдо рдЙрд╕ JSON рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╕реЗрд╡рд╛ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


 message = JSON.parse(String(req.body)) 

рдбреЗрдЯрд╛ req.body рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдБрдЪрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдбреЗрдЯрд╛ рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрд╛рдВрддрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред JSON.parse рд╡рд┐рдзрд┐ рдПрдХ JSON.jl рдкреИрдХреЗрдЬ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рдХреЛ JSON.jl рдФрд░ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреА рд╣реИред рдЪреВрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд╕реНрддреБ рдПрдХ рд╕рд╛рд╣рдЪрд░реНрдп рд╕рд░рдгреА (рдбрд┐рдХреНрдЯ) рд╣реИ, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕рдореЗрдВ рдПрдХ рдирдИ рдХреБрдВрдЬреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдкрдВрдХреНрддрд┐


 message["server_mark"] = "confirmed" 

confirmed рдЧрдП рдорд╛рди рдХреЗ рд╕рд╛рде server_mark рдХреБрдВрдЬреА рдЬреЛрдбрд╝рддрд╛ рд╣реИред


HTTP.serve(ROUTER, Sockets.localhost, 8080) рд▓рд╛рдЗрди HTTP.serve(ROUTER, Sockets.localhost, 8080) рд╣реЛрдиреЗ рдкрд░ рд╕реЗрд╡рд╛ HTTP.serve(ROUTER, Sockets.localhost, 8080) рд╣реЛ HTTP.serve(ROUTER, Sockets.localhost, 8080) рд╣реИ HTTP.serve(ROUTER, Sockets.localhost, 8080) ред


HTTP.jl рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ ( verbose=1 рдХреЗ рд╕рд╛рде рдЧреНрд░рд╛рд╣рдХ рдХреЛрдб рдЪрд▓рд╛рддреЗ рд╕рдордп рдкреНрд░рд╛рдкреНрдд)


 GET / HTTP/1.1 HTTP/1.1 200 OK <= (GET / HTTP/1.1) Hello World GET /user/Jemand HTTP/1.1 HTTP/1.1 200 OK <= (GET /user/Jemand HTTP/1.1) Hello Jemand POST /resource/process HTTP/1.1 HTTP/1.1 200 OK <= (POST /resource/process HTTP/1.1) {"body":"Test document with some content.","server_mark":"confirmed","title":"Some document"} 

Hello Jemand verbose=1 рд╕рд╛рде рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рдЦрд┐рд▓рд╛рдл, рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдЗрдиреЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: Hello World , Hello Jemand , "server_mark":"confirmed" ред


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


Mux.jl рдкреИрдХреЗрдЬ


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


 #!/usr/bin/env julia --project=@. using Mux using JSON @app test = ( Mux.defaults, page(respond("<h1>Hello World!</h1>")), page("/user/:user", req -> "<h1>Hello, $(req[:params][:user])!</h1>"), route("/resource/process", req -> begin message = JSON.parse(String(req[:data])) @info message message["server_mark"] = "confirmed" return Dict( :body => JSON.json(message), :headers => [("Content-Type" => "application/json")] ) end), Mux.notfound() ) serve(test, 8080) Base.JLOptions().isinteractive == 0 && wait() 

рдпрд╣рд╛рдВ page рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдорд╛рд░реНрдЧреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ @app рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред page рд╡рд┐рдзрд┐ рдХреЗ рддрд░реНрдХ рдорд╛рд░реНрдЧ рдФрд░ рд╣реИрдВрдбрд▓рд░ рд╣реИрдВред рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЕрдиреБрд░реЛрдз рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдЗрд╕реЗ рдПрдХ рд▓рдВрдмреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ, Mux.notfound() рдирд┐рд░реНрджрд┐рд╖реНрдЯ Not found рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИред рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЬреЛ рдкрд░рд┐рдгрд╛рдо рднреЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрд╕реЗ HTTP.Response рдореЗрдВ рдкреИрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ Mux рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд░реЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдкрдХреЛ рдЕрднреА рднреА JSON рдХреЛ рд╕реНрд╡рдпрдВ рдХрд░рдирд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рд╣реИ - JSON.json(message) ред


  message = JSON.parse(String(req[:data])) message["server_mark"] = "confirmed" return Dict( :body => JSON.json(message), :headers => [("Content-Type" => "application/json")] ) 

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЦреЗрддреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╣рдпреЛрдЧреА рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ :body :headers ред


serve(test, 8080) рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рдирд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ:


 Base.JLOptions().isinteractive == 0 && wait() 

рдЕрдиреНрдпрдерд╛, рд╕реЗрд╡рд╛ HTTP.jl рдкрд░ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ HTTP.jl


рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛:


 GET / HTTP/1.1 HTTP/1.1 200 OK <= (GET / HTTP/1.1) <h1>Hello World!</h1> GET /user/Jemand HTTP/1.1 HTTP/1.1 200 OK <= (GET /user/Jemand HTTP/1.1) <h1>Hello, Jemand!</h1> POST /resource/process HTTP/1.1 HTTP/1.1 200 OK <= (POST /resource/process HTTP/1.1) {"body":"Test document with some content.","server_mark":"confirmed","title":"Some document"} 

рдкреИрдХреЗрдЬ рдмрдбреНрдбреВ.рдЬреНрд▓


рдкреИрдХреЗрдЬ рдХреЛ рдлреАрдирд┐рдХреНрд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдкреНрд░рднрд╛рд╡ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рдПрд▓рд┐рдХреНрд╕рд┐рд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдПрд▓рд┐рдХреНрд╕рд┐рд░ рдкрд░ рдкреНрд░рдХреНрд╖реЗрдкрдг рдореЗрдВ рд░реВрдмреА рд╕рдореБрджрд╛рдп рд╕реЗ рд╡реЗрдм рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛рдлреА рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣реА рд╣реИ рдФрд░ рдЗрд╕реЗ RESTful API рдФрд░ рд╣рд▓реНрдХреЗ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред JSON рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬреЗрд╢рди рдФрд░ рдбреАрд░рд┐рдПрд░рд▓рд╛рдЗрдЬреЗрд╢рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рд╣реИрдВред рдпрд╣ HTTP.jl рдФрд░ Mux.jl рдореЗрдВ рдЧреБрдо рд╣реИред рдЖрдЗрдП рд╣рдорд╛рд░реА рд╡реЗрдм рд╕реЗрд╡рд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦреЗрдВред


 #!/usr/bin/env julia --project=@. using Bukdu using JSON #   struct WelcomeController <: ApplicationController conn::Conn end #   index(c::WelcomeController) = render(JSON, "Hello World") welcome_user(c::WelcomeController) = render(JSON, "Hello " * c.params.user) function process_resource(c::WelcomeController) message = JSON.parse(String(c.conn.request.body)) @info message message["server_mark"] = "confirmed" render(JSON, message) end #   routes() do get("/", WelcomeController, index) get("/user/:user", WelcomeController, welcome_user, :user => String) post("/resource/process", WelcomeController, process_resource) end #   Bukdu.start(8080) Base.JLOptions().isinteractive == 0 && wait() 

рдкрд╣рд▓реА рдмрд╛рдд рдЬрд┐рд╕ рдкрд░ рдЖрдкрдХреЛ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рд╣реИ рдирд┐рдпрдВрддреНрд░рдХ рд░рд╛рдЬреНрдп рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛ рдХреА рдШреЛрд╖рдгрд╛ред


 struct WelcomeController <: ApplicationController conn::Conn end 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рдЕрдореВрд░реНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ ApplicationController рд╡рдВрд╢рдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗ рдкрд┐рдЫрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдПрдХ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реА JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдВрддрд░ рд╣реИред


 function process_resource(c::WelcomeController) message = JSON.parse(String(c.conn.request.body)) @info message message["server_mark"] = "confirmed" render(JSON, message) end 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, JSON.parse рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ JSON.parse рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди JSON.parse render(JSON, message) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ JSON.parse рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдорд╛рд░реНрдЧреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╢реИрд▓реА рдореЗрдВ рдорд╛рдгрд┐рдХ рдХреЗ рд▓рд┐рдП рдХреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ do...end рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИред


 routes() do get("/", WelcomeController, index) get("/user/:user", WelcomeController, welcome_user, :user => String) post("/resource/process", WelcomeController, process_resource) end 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд░реВрдмрд┐рд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рдВрдкрд░рд┐рдХ рддрд░реАрдХреЗ рд╕реЗ, рдорд╛рд░реНрдЧ рдЦрдВрдб /user/:user рдореЗрдВ рдПрдХ рдЦрдВрдб рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЪрд░ рд╣рд┐рд╕реНрд╕рд╛, рдЬрд┐рд╕ рддрдХ рдкрд╣реБрдВрдЪ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╛рдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд░реВрдк рд╕реЗ Symbol рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╛рдорд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡реИрд╕реЗ, рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдк Symbol рдЕрд░реНрде рд╣реИ, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд░реВрдмреА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди - рдпрд╣ рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рдПрдХрд▓ рдЙрджрд╛рд╣рд░рдг рджреНрд╡рд╛рд░рд╛ рд╕реНрдореГрддрд┐ рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред


рддрджрдиреБрд╕рд╛рд░, рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдПрдХ рдЪрд░ рднрд╛рдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдорд╛рд░реНрдЧ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдЪрд░ рднрд╛рдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рднреА рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╛рдо рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдлреЙрд░реНрдо c.params.user рдореЗрдВ рдбреЙрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝реАрд▓реНрдб рддрдХ c.params.user ред


 welcome_user(c::WelcomeController) = render(JSON, "Hello " * c.params.user) 

рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛:


 GET / HTTP/1.1 HTTP/1.1 200 OK <= (GET / HTTP/1.1) "Hello World" GET /user/Jemand HTTP/1.1 HTTP/1.1 200 OK <= (GET /user/Jemand HTTP/1.1) "Hello Jemand" POST /resource/process HTTP/1.1 HTTP/1.1 200 OK <= (POST /resource/process HTTP/1.1) {"body":"Test document with some content.","server_mark":"confirmed","title":"Some document"} 

рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛ рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖:


 >./bukdu_json.jl INFO: Bukdu Listening on 127.0.0.1:8080 INFO: GET WelcomeController index 200 / INFO: GET WelcomeController welcome_user 200 /user/Jemand INFO: Dict{String,Any}("body"=>"Test document with some content.","title"=>"Some document") INFO: POST WelcomeController process_resource200 /resource/process 

рдкреИрдХреЗрдЬ рдЬрд┐рдиреА.рдЬреЗрдПрд▓


рдПрдХ рдорд╣рддреНрд╡рд╛рдХрд╛рдВрдХреНрд╖реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЬрд┐рд╕реЗ рдПрдорд╡реАрд╕реА рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрдирдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ, рдЬреВрд▓рд┐рдпрд╛ рдкрд░ "рд░реЗрд▓" рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЬрдирд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣реА рд╣реИ, рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдпрд╣ рдкреИрдХреЗрдЬ рдЬреВрд▓рд┐рдпрд╛ рдкреИрдХреЗрдЬ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред рдпрд╣реА рд╣реИ, рдЗрд╕рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗрд╡рд▓ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдЧрд┐рдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рд╕рдВрднрд╡ рд╣реИ:


 julia>] # switch to pkg> mode pkg> add https://github.com/essenciary/Genie.jl 

рдЬрд┐рдиреА рдореЗрдВ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛ рдХрд╛ рдХреЛрдб рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ (рд╣рдо рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ):


 #!/usr/bin/env julia --project=@. #     import Genie import Genie.Router: route, @params, POST import Genie.Requests: jsonpayload, rawpayload import Genie.Renderer: json! #      route("/") do "Hello World!" end route("/user/:user") do "Hello " * @params(:user) end route("/resource/process", method = POST) do message = jsonpayload() # if message == nothing # dump(Genie.Requests.rawpayload()) # end message["server_mark"] = "confirmed" return message |> json! end #   Genie.AppServer.startup(8080) Base.JLOptions().isinteractive == 0 && wait() 

рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдШреЛрд╖рдгрд╛ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред


 route("/") do "Hello World!" end 

рдпрд╣ рдХреЛрдб рд░реВрдмреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдкрд░рд┐рдЪрд┐рдд рд╣реИред do...end рд╡рд┐рдзрд┐ рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдФрд░ рдорд╛рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ do...end рдмреНрд▓реЙрдХ рдХрд░реЗрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬреВрд▓рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХреЛрдб рдХреЛ рдлреЙрд░реНрдо рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 route(req -> "Hello World!", "/") 

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


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


 route("/resource/process", method = POST) do message = jsonpayload() # if message == nothing # dump(Genie.Requests.rawpayload()) # end message["server_mark"] = "confirmed" return message |> json! end 

рдпрд╣рд╛рдБ рдХреЛрдб рдЯрд┐рдкреНрдкрдгреА рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред jsonpayload() рд╡рд┐рдзрд┐ nothing рджреЗрддрд╛ рд╣реИ рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЗрдирдкреБрдЯ рдлреЙрд░реНрдореЗрдЯ JSON рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рд╣реЗрдбрд░ [("Content-Type" => "application/json")] рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдпрдерд╛ рдЬрд┐рдиреА рднреА JSON рдХреЗ рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЕрдЧрд░ рдХреБрдЫ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рддреЛ рдпрд╣ rawpayload() рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЪреВрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЪрд░рдг рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рдХреЛрдб рдореЗрдВ рдирд╣реАрдВ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдкреНрд░рд╛рд░реВрдк message |> json! рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП message |> json! ред json!(str) рд╡рд┐рдзрд┐ рдХреЛ рдпрд╣рд╛рдБ рдкрд╛рдЗрдк рд▓рд╛рдЗрди рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдХрд╛ рдХреНрд░рдорд╛рдВрдХрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЬрд┐рдиреНрди рд╕рд╣реА Content-Type рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ return рд╢рдмреНрдж рдмреЗрдорд╛рдиреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░реВрдмреА рдХреА рддрд░рд╣ рдЬреВрд▓рд┐рдпрд╛, рд╣рдореЗрд╢рд╛ рдЕрдВрддрд┐рдо рдСрдкрд░реЗрд╢рди рдпрд╛ рдЕрдВрддрд┐рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рдпрд╛рдиреА return рд╢рдмреНрдж рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред


рдЬрд┐рдиреА рдХреА рдХреНрд╖рдорддрд╛рдПрдВ рдЦрддреНрдо рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╡реЗрдм рд╕реЗрд╡рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред


рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛:


 GET / HTTP/1.1 HTTP/1.1 200 OK <= (GET / HTTP/1.1) Hello World! GET /user/Jemand HTTP/1.1 HTTP/1.1 200 OK <= (GET /user/Jemand HTTP/1.1) Hello Jemand POST /resource/process HTTP/1.1 HTTP/1.1 200 OK <= (POST /resource/process HTTP/1.1) {"body":"Test document with some content.","server_mark":"confirmed","title":"Some document"} 

рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛ рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖:


 >./genie_json.jl [ Info: Ready! 2019-04-24 17:18:51:DEBUG:Main: Web Server starting at http://127.0.0.1:8080 2019-04-24 17:18:51:DEBUG:Main: Web Server running at http://127.0.0.1:8080 2019-04-24 17:19:21:INFO:Main: / 200 2019-04-24 17:19:21:INFO:Main: /user/Jemand 200 2019-04-24 17:19:22:INFO:Main: /resource/process 200 

рдкреИрдХреЗрдЬ JuliaWebAPI.jl


рдпрд╣ рдкреИрдХреЗрдЬ рдЙрди рджрд┐рдиреЛрдВ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдкрд░рдд рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдирд╛рдд рдерд╛ рдЬрдм HTTP.jl рд╕рд┐рд░реНрдл рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдерд╛ рдЬреЛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЗ рд▓реЗрдЦрдХ рдиреЗ рд╕реНрд╡реИрдЧрд░ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ (OpenAPI рдФрд░ http://editor.swagger.io/ ) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рд╕рд░реНрд╡рд░ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ - рдкрд░рд┐рдпреЛрдЬрдирд╛ https://github.com/JuliaComputing/Swagger.jl рджреЗрдЦреЗрдВ , рдФрд░ рдЗрд╕ рдЬрдирд░реЗрдЯрд░ рдиреЗ рдЬреВрд▓рд┐рдпрд╛рд╡реЗрдмрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ .jlред рд╣рд╛рд▓рд╛рдБрдХрд┐, JuliaWebAPI.jl рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ POST рдЕрдиреБрд░реЛрдз рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд░реНрд╡рд░ рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдЕрдиреБрд░реЛрдз (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, JSON) рдХреЗ рд╢рд░реАрд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдЦрдХ рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрдерд╛ рдХрд┐ рдХреБрдВрдЬреА-рдорд╛рди рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╕рднреА рдЕрд╡рд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ ... рдЗрд╕ рдкреИрдХреЗрдЬ рдХрд╛ рднрд╡рд┐рд╖реНрдп рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рд╕рднреА рдХрд╛рд░реНрдп рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдЕрдиреНрдп рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ HTTP.jl рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред Swagger.jl рдкреИрдХреЗрдЬ рднреА рдЕрдм рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


WebSockets.jl


WebSocket рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди HTTP.ll рдкреИрдХреЗрдЬ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред WebSockets.jl рдкреИрдХреЗрдЬ рд╕реНрд╡рдпрдВ HTTP.jl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЕрдм, рдпрд╣ рдирдП рдШрдЯрдирд╛рдХреНрд░рдо рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдирд┐рд╖реНрдХрд░реНрд╖


рдпрд╣ рд╕рдореАрдХреНрд╖рд╛ рдЬреВрд▓рд┐рдпрд╛ рдкрд░ рдПрдХ рд╡реЗрдм рд╕реЗрд╡рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИред рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдФрд░ рд╕рдмрд╕реЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рддрд░реАрдХрд╛ рд╕реАрдзреЗ HTTP.jl рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмреБрдХрдбреВ.рдЬреНрд▓ рдФрд░ рдЬрд┐рдиреА.рдЬреНрд▓ рд╕рдВрдХреБрд▓ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИрдВред рдХрдо рд╕реЗ рдХрдо, рдЙрдирдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред Mux.jl рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЗрд╕рдХреЗ рдлрд╛рдпрджреЗ рдЕрдм HTTP.jl рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд╡рд┐рд░реБрджреНрдз рднрдВрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░рд╛рдп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИред рдЬрд┐рдиреА.рдЬреЗрдПрд▓ рдПрдХ рдмрд╣реБрдд рд╣реА рдЖрд╢рд╛рдЬрдирдХ рдврд╛рдВрдЪрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдХрдо рд╕реЗ рдХрдо рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд▓реЗрдЦрдХ рдЗрд╕реЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ JSON рдбрд┐рдЬреЗрд░рд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЬрд┐рдиреА рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдкрд╛рд░реНрд╕рд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред HTTP.jl рдХреЗ рд▓рд┐рдП рдРрд╕реЗ рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:


  local message = nothing local body = IOBuffer(HTTP.payload(req)) try message = JSON.parse(body) catch err @error err.msg return HTTP.Response(400, string(err.msg)) end 

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдо рдпрд╣ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЬреВрд▓рд┐рдпрд╛ рдореЗрдВ рд╡реЗрдм рд╕реЗрд╡рд╛рдПрдБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░реНрдпрд╛рдкреНрдд рдзрдирд░рд╛рд╢рд┐ рдореМрдЬреВрдж рд╣реИред рдпрд╣реА рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП "рдкрд╣рд┐рдпрд╛ рдХреЛ рд╕реБрджреГрдврд╝ рдХрд░рдиреЗ" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдЧрд▓рд╛ рдЪрд░рдг рдпрд╣ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдЬреВрд▓рд┐рдпрд╛ рдореМрдЬреВрджрд╛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЗрдВ рд▓реЛрдб рдХрд╛ рд╕рд╛рдордирд╛ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреА рд╣реИ, рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕реЗ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдм рд╣рдореЗрдВ рдЗрд╕ рд╕рдореАрдХреНрд╖рд╛ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред


рд╕рдВрджрд░реНрдн


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


All Articles