dlang
D言語
D言語くん
dlangman

D言語ネイティブHTTPクライアントdlang-requestsの基本的な使い方

はじめに

D-man botで使われているtwitter4dstd.net.curlを使っているためlibcurlに依存しています。
今回、std.net.curlからdlang-requestsに変更するために調べた使い方をまとめます。

dlang-requests

読んで字のごとくpython-requestsインスパイア系のHTTP/FTPクライアントライブラリです。
APIは3つのレベルに分かれています。

  • 最も高水準なgetContentpostContent
  • Requestを用いResponse構造体を返すRequest.get(), Reuest.post, Request.exec!"method"など
  • 最も低水準なHTTPRequestFTPRequest

今回は2つ目のRequestResponseの使います。

Request

GET

Request rq = Request();
Response rs = rq.get("https://httpbin.org/");
assert(rs.code==200);

std.net.curlは2xx以外のコードを受け取ったとき例外を返しますが、dlang-requestはハンドリングできます。

POST

POSTもGETと同様にResponseを返します。
また、RequestにはaddHeadersでヘッダーを付加できます。

auto rq = Request();
rq.addHeaders(["User-Agent": "test-123", "X-Header": "x-value"]);
auto rs = rq.post("http://httpbin.org/post", `{"a":"b"}`, "application/x-www-form-urlencoded");

Response

レスポンスの詳細を表します。

  • code - HTTP/FTPのレスポンスコード
  • responseBody - レスポンスのボディ部
  • responseHeaders - レスポンスのヘッダー部

Streaming server response

useStreamingtrueにすることで逐次レスポンスを受け取ることができます。

auto rq = Request();
rq.useStreaming = true;
rq.verbosity = 2;
auto rs = rq.get("http://httpbin.org/image/jpeg");
auto stream = rs.receiveAsRange();
while(!stream.empty) {
    writefln("Received %d bytes, total received %d from d ocument legth %d", stream.front.length, 
    rq.contentReceived, rq.contentLength);
    stream.popFront;
}

byChunkAsyncとほぼ同等の挙動をします。

さいごに

コミット[1][2]しました。