2
0

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.

D言語くんAdvent Calendar 2017

Day 10

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

Last updated at Posted at 2017-12-24

はじめに

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

2
0
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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?