dlang-requests-python-requestsと同様、Dのみ(パート2)

良い一日!



記事の第2部では、あまり標準的でないケースでのdlang-requestsライブラリの使用について説明します。







リクエストとレスポンス



ライブラリの下位レベルには、ライブラリのすべての機能を提供するリクエスト構造があります。



リクエストには、他のメソッドの中でも、getContent()およびpostContent()で使用されるgetおよびpostメソッドがあります。これらについては、最初の部分で説明します。 呼び出しのパラメーターは、getContent()およびpostContent()のパラメーターと一致します。 なぜこの構造が必要なのですか?



まず、そのメソッドを通じて、クエリの実行を制御する方法を説明します。





コンテンツストリーミング



python-requestsのエレガントな機能はストリーミングです-ユーザーはサーバーから応答を受信しますが、最後にではなく、ドキュメントを受信します。 大きなドキュメントを受信して​​処理する場合、この方法はメモリの節約に役立ちます。 python-requestsを使用すると、ドキュメントを反復子として受け取ることができます。 Dの場合、InputRangeを使用するのが自然です。 この場合、回答を使用してデータを受信するだけでなく、InputRangeで動作するアルゴリズムで直接使用することもできます。



 import std.stdio; import std.format; import requests; void main() { auto rq = Request(); rq.useStreaming = true; rq.verbosity = 2; auto rs = rq.get("https://api.github.com/search/repositories?order=desc&sort=updated&q=language:D"); if ( rs.code == 200 ) { auto stream = rs.receiveAsRange(); while( !stream.empty ) { writefln("portion of %d bytes received".format(stream.front.length)); stream.popFront; } } }
      
      







結論
 > GET /search/repositories?order=desc&sort=updated&q=language:D HTTP/1.1 > Connection: Keep-Alive > User-Agent: dlang-requests > Accept-Encoding: gzip, deflate > Host: api.github.com > < HTTP/1.1 200 OK < server: GitHub.com < date: Sat, 25 Jun 2016 15:45:28 GMT < content-type: application/json; charset=utf-8 < transfer-encoding: chunked < content-encoding: gzip < x-github-request-id: B077660C:560B:7F2F21:576EA717 < 277 bytes of body received < 1370 bytes of body received portion of 751 bytes received portion of 2988 bytes received portion of 4632 bytes received portion of 6002 bytes received portion of 7474 bytes received portion of 9106 bytes received portion of 10246 bytes received portion of 11356 bytes received portion of 12290 bytes received portion of 12870 bytes received portion of 63904 bytes received
      
      







ここで、バイト配列がストリームの要素のタイプになることがわかります。 したがって、数字をカウントするための次のコードでは、ジョイナーの使用が必要です。

 import std.stdio; import std.ascii; import std.algorithm; import requests; void main() { auto rq = Request(); rq.useStreaming = true; auto stream = rq.get("https://api.github.com/search/repositories?order=desc&sort=updated&q=language:D").receiveAsRange; writeln(stream.joiner.filter!isDigit.count); }
      
      





大量のドキュメントをその場で処理することに加えて、ストリーミングはドキュメントをディスクに保存する最も簡単な方法を提供します。



ストリーミングは、GETリクエストだけでなく、コード200のドキュメントを返すリクエストにも有効です。



PUT / DELETE / HEADメソッド...



これまでにリストされたすべてのメソッドは、最終的に、テンプレートメソッドRequest.exec(メソッド)を使用します。これは、HTTPメソッドを制御するテンプレートパラメーターに加えて、前述のパラメーターのすべての組み合わせを受け入れます。



 import std.stdio; import std.ascii; import std.range; import std.algorithm; import requests; void main() { auto rq = Request(); rq.useStreaming = true; auto rs = rq.exec!"HEAD"("https://api.github.com/search/repositories?order=desc&sort=updated&q=language:D"); rs.code.writeln; rs.responseHeaders. byKeyValue. take(5). each!(p=>writeln(p.key, ": ", p.value)); }
      
      





おわりに
200

x-frame-options:拒否

キャッシュ制御:キャッシュなし

x-xss-protection:1; モード=ブロック

変化する:Accept-Encoding

コンテンツタイプ:アプリケーション/ json; 文字セット= utf-8





どのHTTPメソッドも同じ方法で呼び出すことができます。



これで、記事の第2部は終わりです。



念のため、もう一度、 Githubのプロジェクトページへのリンク



皆さんに幸運を祈り、プログラミングをお楽しみください!



All Articles