17
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JuliaでAPIを実装する

Last updated at Posted at 2019-04-30

今回はJuliaで簡単なAPIを実装していきます。
Juliaは科学技術計算やデータサイエンスに強い言語ということで、
JuliaでAPIを作れると、上記のような分野のアプリケーションを開発しやすくなると期待してます。

おしながき

  • Genieとは?
  • HTTP.jl
  • 実装解説

Genieとは?

「Ginei」はJulia製のWebフレームワークです。
JuliaのWebフレームワークの中では一番開発が盛んに行われています。
Geine公式

genie.png

インストールは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です。

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を叩く側の実装を見ていきます。

stb.jl

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アプリケーションを実装したいですね。

17
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?