RSS

Julia の勉強:HTTP を利用する

16 12月

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
$

 
コメントする

投稿者: : 2021/12/16 投稿先 Julia

 

タグ: ,

コメントを残す