Julia の標準パッケージには Sockets というものがありますが、TCP と UDP しかサポートされてないため、ブラウザをクライアントにすることはできません。(HTTP は TCP の上位プロトコルです)
また、ウェブサービスを利用する場合も HTTP のリクエスト文字列を構築しとレスポンスを解析しなければなりません。
HTTP パッケージを使うと HTTP を容易に利用できます。
そして、HTTP クライアントも HTTP サーバも構築可能です。
ただ、HTTP サーバに関しては HTTP パッケージをバックエンドにした Mux を利用した方が簡単になるので、ここでは HTTP クライアントのみについて勉強します。
HTTP をインストールするには次のようにパッケージモードで add します。
pkg> add HTTP
下の例は HTTP のパッケージ github の README.md に出ていた簡単なサンプルです。
r = HTTP.request("GET", "http://httpbin.org/ip"; verbose=3) println(r.status) println(String(r.body))
これを実行すると、下のように表示されます。(ただし、’?’ は具体的な数字が入る)
200 { "origin": "1??.1??.121.156" }
なお、http://httpbin.org は次のようなサイトです。
このサンプルは get() を使ってもっと簡単に書けます。
using HTTP r = HTTP.get("http://httpbin.org/ip") println(r.status) println(String(r.body))
ウェブサービスの多くは JSON を使うので、JSON パッケージをインストールしておいた方がよいです。(JSON3 というパッケージもあります)
pkg> add JSON
JSON パッケージを使って上記のサンプルプログラムを改良してみます。
using HTTP using JSON r = HTTP.get("http://httpbin.org/ip") if r.status == 200 data = JSON.parse(String(r.body)) println(data["origin"]) else println("エラー: ", r.status) end
このプログラムを実行すると 1??.1??.121.156 だけが表示されます。
次に POST メソッドを使ってみましょう。
次のサンプルプログラムは、POST メソッドで http://httpbin.org/post へデータを送って応答を表示するものです。
using HTTP using JSON const URL = "http://httpbin.org/post" r = HTTP.post(URL, ["p"=>1080, "name"=>"Beauty and Beast"]) if r.status == 200 resp = String(r.body) println(resp) data = JSON.parse(resp) println("p: ", data["headers"]["P"]) println("name: ", data["headers"]["Name"]) else println("エラー: ", r.status) end
このプログラムを実行すると、下のようになりました。送ったデータのエコーは headers の中に含まれていました。
$ julia test3.jl { "args": {}, "data": "", "files": {}, "form": {}, "headers": { "Accept": "*/*", "Content-Length": "0", "Host": "httpbin.org", "Name": "Beauty and Beast", "P": "1080", "User-Agent": "HTTP.jl/1.7.0", "X-Amzn-Trace-Id": "Root=1-61ba6b4e-54c6f1721ca09fde69f521dc" }, "json": null, "origin": "131.147.121.156", "url": "http://httpbin.org/post" } p: 1080 name: Beauty and0Beast $