今回はJuliaで簡単なAPIを実装していきます。
Juliaは科学技術計算やデータサイエンスに強い言語ということで、
JuliaでAPIを作れると、上記のような分野のアプリケーションを開発しやすくなると期待してます。
おしながき
- Genieとは?
- HTTP.jl
- 実装解説
Genieとは?
「Ginei」はJulia製のWebフレームワークです。
JuliaのWebフレームワークの中では一番開発が盛んに行われています。
Geine公式
インストールはREPLから行います。
$ julia
julia>] #]を入力することでPkgモードに切り替えられます
Pkg> add https://github.com/essenciary/Genie.jl
HTTP.jl
APIの実装を確認するために、リクエストを送るコードも実装します。
リクエストはHTTP.jlを使用して実装していきます。
HTTP.jlはPythonでいう「requests.py」のようなパッケージで、
RESTリクエストの他に、WebSocketやサーバー機能の実装も可能です。
APIの実装はHTTP.jlでもできそうですがGenieの方が好きなので、リクエストにしか使いません。
インストールはGenieと同じく、REPLから行います。
$ julia
julia>] #]を入力することでPkgモードに切り替えられます
Pkg> add HTTP
実装解説
まずはAPI側の実装を説明します。
今回作成するAPIはPOSTでTODOを登録し、GETでTODOを返すシンプルなものになります。
まずは、必要なパッケージをインポートします。
using Genie, Genie.Requests
import Genie.Router: route
import Genie.Renderer: json!
サーバーを同期的に起動させるためのパラメーターを設定します。
Genie.config.run_as_server = true
次にPOSTメソッドを定義します。
エンドポイントは/todo
となり、後から実装するGETメソッドと同じにします。
POSTメソッドでは、JSONを受け取りリストに保存します。
POSTが成功すれば、メッセージを返えします。
APIの戻り値はGenie.Rendererにパイプします。
route("/todo", method = "POST") do
message = jsonpayload()
push!(todo, (message["todo"],message["day"]))
(:message => "POST success") |> json!
end
ちなみにですが、"|>"はパイプ演算子といって、左側になんらかの値を指定し、
右側に関数を指定することで、左側の値を関数の引数として指定する演算子です。
複数の関数に連鎖的に値を入れたい時などに使うと便利です。
次に、GETメソッドを定義します。
エンドポイントは/todo
となり、POSTと同じです。
route("/todo", method = "GET") do
message = join(todo, ", ")
(:message => message) |> json!
end
最後にサーバーの起動を指定します。
Genie.AppServer.startup()
一応、コード全体を書きます。↓
サーバーの起動はjulia rest.jl
です。
using Genie, Genie.Requests
import Genie.Router: route
import Genie.Renderer: json!
Genie.config.run_as_server = true
todo = []
route("/todo", method = "POST") do
message = jsonpayload()
push!(todo, (message["todo"],message["day"]))
(:message => "POST success") |> json!
end
route("/todo", method = "GET") do
message = join(todo, ", ")
(:message => message) |> json!
end
Genie.AppServer.startup()
リクエストコード実装
次に、APIを叩く側の実装を見ていきます。
using HTTP
base_url = "http://127.0.0.1:8000/todo"
headers = [("Content-Type", "application/json")]
body = """{"todo":"create api", "day":"5/1"}"""
post_request = HTTP.request("POST", base_url, headers, body)
println(post_request.body |> String)
get_request = HTTP.request("GET", base_url, headers, body)
println(replace(get_request.body |> String, "\\\"" => ""))
叩く方の実装はそんな難しくないと思います。
リクエストはHTTP.request
でメソッド・URL・ヘッダー・リクエストデータを指定するだけです。
julia stb.jl
で実行すれば
{"message":"POST success"}
{"message":"(create api, 5/1)"}
が、帰ってくるはずです。
まとめ
Juliaで簡単なAPIを実装しました。
次はWebアプリケーションを実装したいですね。