Edited at

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

More than 1 year has passed since last update.


はじめに

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]しました。