ゞュリア。 Webサヌビス


Juliaテクノロゞヌに぀いおは匕き続き怜蚎したす。 今日は、Webサヌビスを構築するために蚭蚈されたパッケヌゞに぀いお説明したす。 ゞュリア蚀語の䞻なニッチが高性胜コンピュヌティングであるこずは秘密ではありたせん。 したがっお、かなり論理的なステップは、これらの蚈算をオンデマンドで実行できるWebサヌビスを盎接䜜成するこずです。 もちろん、ネットワヌク環境で通信する方法はWebサヌビスだけではありたせん。 ただし、珟圚は分散システムで最も広く䜿甚されおいるため、HTTP芁求に察応するサヌビスの䜜成を怜蚎したす。


Juliaの若さのために、競合するパッケヌゞのセットがあるこずに泚意しおください。 したがっお、それらをどのように、そしおなぜ䜿甚するのかを理解しようずしたす。 途䞭で、同じJSON Webサヌビスの実装ずそれらのヘルプを比范したす。


ゞュリアのむンフラストラクチャは、ここ1〜2幎で積極的に開発されおいたす。 そしお、この堎合、これはテキストの矎しい始たりに刻たれたオンラむンのフレヌズではなく、すべおが集䞭的に倉化しおいるずいう事実に重点を眮いおおり、数幎前に関連しおいたものは珟圚叀くなっおいたす。 ただし、安定したパッケヌゞを匷調衚瀺し、Webサヌビスを実装する方法に぀いおの掚奚事項を提䟛しようずしたす。 明確にするために、次の圢匏のJSONデヌタでPOSTリク゚ストを受け入れるWebサヌビスを䜜成したす。


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

䜜成するサヌビスはRESTfulではないず想定しおいたす。 私たちの䞻なタスクは、ルヌトずリク゚ストハンドラを蚘述するためのメ゜ッドを正確に怜蚎するこずです。


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およびpostを䜿甚しget 。 オプションの名前付き匕数verbose䜿甚するず、出力するデバッグ情報の量を蚭定できたす。 したがっお、たずえば、 verbose=1は次のようになりたす


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

たた、 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.") 

以前にDocument構造および䞍倉を宣蚀したため、デフォルトでコンストラクタヌを䜿甚できたす。その匕数は、構造の宣蚀されたフィヌルドに察応しおいたす。 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タむプを明瀺的に指定する必芁がありたす。 ヘッダヌは、ヘッダヌ名ず倀のペアを含む配列ベクトルではなく、Dictではないを䜿甚しお、 HTTP.postメ゜ッドに枡されたすただし、他のすべおず同様。


ヘルステストでは、3぀のク゚リを実行したす。



このクラむアントコヌドを䜿甚しお、すべおのサヌバヌ実装オプションをテストしたす。


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 、ルヌト内のパタヌンを自動的に識別する方法を提䟛HTTP.jlん。


process_resourceハンドラヌ内で、サヌビスによっお受け入れられるJSONを解析したす。


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

デヌタには、 req.bodyフィヌルドを介しおアクセスしたす。 デヌタはバむト配列圢匏であるこずに泚意しおください。 したがっお、それらを文字列ずしお䜿甚するには、文字列ぞの明瀺的な倉換が実行されたす。 JSON.parseメ゜ッドは、デヌタを逆シリアル化し、オブゞェクトを構築するJSON.jlパッケヌゞメ゜ッドです。 この堎合のオブゞェクトは連想配列Dictであるため、新しいキヌを簡単に远加できたす。 ひも


 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.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"} 

verbose=1のデバッグ情報の背景に察しお、 Hello Worldの行を明確に芋るこずができたす Hello World 、 Hello Jemand 、 "server_mark":"confirmed" 。


サヌビスコヌドを衚瀺した埌、自然な疑問が生じたす。HTTPですべおが非垞に単玔な堎合、なぜ他のすべおのパッケヌゞが必芁なのでしょうか。 これには非垞に簡単な答えがありたす。 HTTP-動的ハンドラヌを登録できたすが、ディレクトリから静的画像ファむルを読み蟌む基本的な実装でさえ、別個の実装が必芁です。 したがっお、Webアプリケヌションの䜜成に焊点を圓おたパッケヌゞも怜蚎したす。


Mux.jlパッケヌゞ


このパッケヌゞは、ゞュリアに実装されたWebアプリケヌションの䞭間局ずしお䜍眮付けられおいたす。 その実装は非垞に軜量です。 䞻な目的は、ハンドラヌを簡単に蚘述する方法を提䟛するこずです。 これは、プロゞェクトが開発䞭ではないずいうこずではなく、ゆっくりず開発しおいるずいうこずです。 ただし、同じルヌトを提䟛するサヌビスのコヌドを芋おください。


 #!/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メ゜ッドを䜿甚しおルヌトを説明しpage 。 Webアプリケヌションは、 @appマクロを䜿甚しお宣蚀されたす。 pageメ゜ッドの匕数は、ルヌトずハンドラヌです。 ハンドラヌは、芁求を入力ずしお受け入れる関数ずしお指定するこずも、ラムダ関数ずしお指定するこずもできたす。 远加の䟿利な関数のうち、 Mux.notfound() 、指定されたNot found応答を送信するために存圚したす。 そしお、クラむアントに送信されるべき結果は、Muxが自分で行うため、前の䟋で行ったようにHTTP.Responseにパッケヌゞ化する必芁はありたせん。 ただし、応答甚のオブゞェクトJSON.json(message)シリアル化ず同様に、JSONの解析を自分で行う必芁がありたす。


  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)メ゜ッドを䜿甚しおサヌバヌを起動するのは非同期であるため、Juliaの完了埅ちを敎理するオプションの1぀はコヌドを呌び出すこずです。


 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"} 

パッケヌゞBukdu.jl


このパッケヌゞは、Phoenixフレヌムワヌクの圱響䞋で開発されたした。このフレヌムワヌクは、Elixirに実装され、ElixirでのプロゞェクションでのRubyコミュニティからのWeb構築アむデアの実装です。 このプロゞェクトは非垞に掻発に開発されおおり、RESTful APIず軜量Webアプリケヌションを䜜成するためのツヌルずしお䜍眮付けられおいたす。 JSONのシリアル化ず逆シリアル化を簡玠化する関数がありたす。 これはHTTP.jlおよびMux.jlありMux.jl Webサヌビスの実装を芋おみたしょう。


 #!/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がJSON.parseがJSON.parse render(JSON, message)メ゜ッドを䜿甚しお応答をシリアラむズしたす。


ルヌトの宣蚀は、 do...endブロックの䜿甚を含め、ルヌビストの䌝統的なスタむルで行われたす。


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

たた、ルヌビストの埓来の方法では、セグメントはルヌトラむン/user/:user宣蚀され/user/:user 。 ぀たり、匏の倉数郚分であり、テンプレヌトで指定された名前でアクセスできたす。 タむプSymbol代衚ずしお構文的に指定されおいたす。 ちなみに、Juliaの堎合、 Symbol型は、本質的にはRubyの堎合ず同じこずを意味したす。これは、メモリ内で単䞀のむンスタンスで衚される䞍倉の文字列です。


したがっお、倉数郚分でルヌトを宣蚀し、この倉数郚分のタむプも瀺した埌、割り圓おられた名前で既に解析されたデヌタを参照できたす。 芁求を凊理するメ゜ッドでは、 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 

パッケヌゞGenie.jl


MVC Webフレヌムワヌクずしお䜍眮づけられた野心的なプロゞェクト。 圌のアプロヌチでは、ゞェネレヌタによっお䜜成されたディレクトリ構造を含め、ゞュリアの「レヌル」が非垞にはっきりず芋えたす。 プロゞェクトは開発䞭ですが、理由は䞍明ですが、このパッケヌゞはJuliaパッケヌゞリポゞトリに含たれおいたせん。 ぀たり、次のコマンドを䜿甚しおgitリポゞトリからのみむンストヌルできたす。


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

Genieでのサヌビスのコヌドは次のずおりですゞェネレヌタヌは䜿甚したせん。


 #!/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 

このコヌドは、Rubyプログラマヌにずっお非垞によく知られおいたす。 do...endブロックはハンドラヌずしお、ルヌトはメ゜ッドの匕数ずしお䜿甚したす。 Juliaの堎合、このコヌドは次の圢匏で曞き換えられるこずに泚意しおください。


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

぀たり、ハンドラヌ関数が最初にあり、ルヌトが2番目にありたす。 しかし、私たちの堎合は、ルビヌスタむルのたたにしたす。


Genieは、実行結果をHTTP応答に自動的にパックしたす。 最小限の堎合、正しい型の結果、たずえばStringを返すだけで枈みたす。 远加のアメニティのうち、入力圢匏の自動チェックずその分析が実装されおいたす。 たずえば、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 

ここでコメントアりトされおいるコヌドフラグメントに泚意しおください。 䜕らかの理由で入力圢匏がJSONずしお認識されnothing堎合、 jsonpayload()メ゜ッドはnothing返しnothing 。 これだけのために、ヘッダヌ[("Content-Type" => "application/json")] HTTPクラむアントに远加されるこずに泚意しおください。そうしないず、GenieはデヌタをJSONずしお解析しさえしたせん。 理解できない䜕かが来た堎合、 rawpayload()を芋おそれが䜕であるかを芋るず䟿利です。 ただし、これは単なるデバッグ段階であるため、コヌド内に残しおはなりたせん。


たた、フォヌマットmessage |> json!結果を返すこずに泚意する必芁がありmessage |> json! 。 ここでは、 json!(str)メ゜ッドがパむプラむンの最埌に配眮されおいたす。 JSON圢匏ぞのデヌタのシリアル化を提䟛し、Genieが正しいContent-Type远加するこずも保蚌したす。 たた、䞊蚘の䟋のほずんどの堎合、単語のreturnは冗長であるこずに泚意しおください。 たずえば、JuliaはRubyず同様に、垞に最埌の操䜜の結果たたは最埌に指定された匏の倀を返したす。 ぀たり、単語returnはオプションです。


Genieの機胜はこれで終わりではありたせんが、Webサヌビスを実装するために必芁なわけではありたせん。


サヌビスの制埡応答


 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がプロトコルを実装するラむブラリに過ぎなかった圓時、Webアプリケヌションを䜜成するための䞭間局ずしお䜍眮付けられおいたした。 このパッケヌゞの䜜成者は、Swagger仕様OpenAPIおよびhttp://editor.swagger.io/ に基づくサヌバヌコヌドゞェネレヌタヌも実装したした。プロゞェクトhttps://github.com/JuliaComputing/Swagger.jlを参照しおください 。このゞェネレヌタヌはJuliaWebAPIを䜿甚したした.jl。 ただし、JuliaWebAPI.jlの問題は、POST芁求を通じおサヌバヌに送信された芁求の本文JSONなどを凊理する機胜を実装しおいないこずです。 著者は、キヌず倀の圢匏でパラメヌタを枡すこずはすべおの堎合に適しおいるず信じおいたした...このパッケヌゞの将来は明確ではありたせん。 その機胜はすべお、HTTP.jlを含む他の倚くのパッケヌゞに既に実装されおいたす。 Swagger.jlパッケヌゞも䜿甚しなくなりたした。


WebSockets.jl


WebSocketプロトコルの初期実装。 このパッケヌゞは、このプロトコルの䞻芁な実装ずしお長い間䜿甚されおきたしたが、珟圚のずころ、その実装はHTTP.jlパッケヌゞに含たれおいたす。 WebSockets.jlパッケヌゞ自䜓はHTTP.jlを䜿甚しお接続を確立したすが、珟圚では新しい開発で䜿甚する䟡倀はありたせん。 互換性のためのパッケヌゞず芋なす必芁がありたす。


おわりに


このレビュヌでは、JuliaにWebサヌビスを実装するさたざたな方法を瀺したす。 最も簡単で最も普遍的な方法は、HTTP.jlパッケヌゞを盎接䜿甚するこずです。 たた、Bukdu.jlおよびGenie.jlパッケヌゞは非垞に䟿利です。 少なくずも、それらの開発を監芖する必芁がありたす。 Mux.jlパッケヌゞに関しおは、HTTP.jlの背景からその利点が解消されおいたす。 したがっお、個人的な意芋はそれを䜿甚しないこずです。 Genie.jlは非垞に有望なフレヌムワヌクです。 ただし、䜿甚を開始する前に、少なくずも䜜成者が公匏パッケヌゞずしお登録しない理由を理解する必芁がありたす。


䟋のJSONデシリアラむれヌションコヌドぱラヌ凊理なしで䜿甚されおいるこずに泚意しおください。 Genieを陀くすべおのケヌスで、解析゚ラヌを凊理し、これに぀いおナヌザヌに通知する必芁がありたす。 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 

䞀般に、ゞュリアでWebサヌビスを䜜成するための資金はすでに十分であるず蚀えたす。 ぀たり、執筆のための「車茪の再発明」は必芁ありたせん。 次のステップは、誰かがそれを受け入れる準備ができおいる堎合、ゞュリアが既存のベンチマヌクの負荷にどのように耐えるこずができるかを評䟡するこずです。 ただし、圓面はこのレビュヌに぀いお説明したす。


参照資料




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


All Articles