dlang-requests-python-requestsと同様、Dのみ

良い一日!



dlang-requestsライブラリを紹介したいと思います。 彼女は何のためですか? Dの場合、python-requestsがpythonに対して要求するもの、つまり便利なhttp-(およびftp)クライアントになりたいです。 著者は、ライブラリを書くときの目標は次のとおりであると誓った。



  1. 便利でシンプルなインターフェース
  2. libcurlに匹敵するパフォーマンス
  3. 標準ライブラリDとの互換性


記事の最初の部分は、最も一般的なタスクにdlang-requestsを使用する例で構成されます。



GETリクエストから始めましょう



dlang-requestsを使用して最も単純なアプリケーションを作成しましょう(Unixのような軸の下にいる場合は、シェルに直接コピーして貼り付けてください)。



ダブを使用して最小限のアプリケーションを作成する
 mkdir test-requests && cd test-requests && dub init。 リクエスト
 cat> source / app.d << EOF
 import std.stdio;
インポート要求;

 void main()
 {
     writeln(getContent( "http://httpbin.org"));
 }
 Eof
ダブラン


dub runコマンドの結果として、 httpbin.orgサイトのルートから描画されたhtmlがコンソールに描画されます。



これまでのところ、すべてが単純です。ドキュメントのコンテンツのみが必要な場合は、getContent(url)を使用できます。 この呼び出しは、単にドキュメントを含むバッファを返します。



なぜバイトの配列ではなくバッファが必要なのですか? ほとんどの場合、バッファにはネットワークから直接受信したデータが含まれるため、断片から行を不必要にコピーしたり組み立てたりすることはありません。 必要な場合、バッファはdata()メソッドを使用して簡単にバイト配列に変換できます。

応答をバイト配列に変換します
 import std.stdio;
インポート要求;

 void main()
 {
     auto content = getContent( "http://httpbin.org");
     writeln(typeid(content.data()));
 }




しかし、あなたはそれを必要としますか? 結局のところ、バッファは多くのRangeプリミティブをサポートしており、それを直接使用して対応するアルゴリズムに渡すことができます。 たとえば、応答の行数をカウントするためにコンテンツを文字列に変換する必要はありません。
回答は、範囲を操作する標準ライブラリアルゴリズムで処理できます(同時に、回答のプロパティを確認します)
 import std.stdio;
 import std.range.primitives;
 import std.algorithm;
インポート要求;

 void main()
 {
     auto content = getContent( "http://httpbin.org");
     writeln(content.splitter( '\ n')。count);

    エイリアスタイプ= typeof(コンテンツ);
    静的アサート(isInputRange!タイプ);
    静的アサート(isForwardRange!タイプ);
    静的アサート(hasLength!タイプ);
    静的アサート(hasSlicing!タイプ);
    静的アサート(isBidirectionalRange!タイプ);
    静的アサート(isRandomAccessRange!タイプ);
 } 


別の例:結果のJSONを余分な労力なしで解析できます。

回答からparsim json
  import std.stdio;
 import std.json;
インポート要求;

 void main()
 {
     auto content = getContent( "http://httpbin.org/get");
     auto json = parseJSON(コンテンツ);
     writeln(json);
 } 


投稿を扱う前に、パラメーターを取得する必要がある場合の対処方法を見てみましょう。

パラメータ付きリクエスト取得
 import std.stdio;
 import std.json;
インポート要求;

 void main()
 {
     auto content = getContent( "http://httpbin.org/get"、
                              queryParams( "name"、 "bob"、 "age"、101));
     auto json = parseJSON(コンテンツ);
     writeln(json);
 }






POSTリクエストに渡します。



最初の最も簡単な投稿は、form-urlencodedを使用したWebフォームへの投稿です。 このような投稿は通常、少量のデータを転送するために使用され、呼び出しの種類によっては、パラメーターを使用したget呼び出しに似ています。

form-urlencodedでのPOST
 import std.stdio;
 import std.json;
インポート要求;

 void main()
 {
     auto content = postContent( "http://httpbin.org/post"、queryParams( "name"、 "bob"、 "age"、101));
     auto json = parseJSON(コンテンツ);
     writeln(json);
 } 


注:getContent呼び出しはpostContentに変わり、他に変更はありません。



マルチパートフォームPOST-Webフォームを介したファイルのアップロードなど、大量のデータをサーバーに転送します。
MultipartFormを介してファイルとパラメーターを送信する例
 import std.stdio;
インポート要求;

 void main()
 {
     MultipartFormフォーム。
     form.add(formData( "content"、 "MultipartFormの例"));
     form.add(formData( "file"、File( "source / app.d"、 "rb")、["filename": "app.d"、 "Content-Type": "text / plain"])) ;
     auto content = postContent( "http://httpbin.org/post"、フォーム);
     writeln(コンテンツ);
 } 




form.add(formData(フィールドの説明))を呼び出してフォームに送信するフィールドを収集します。formDataの最初のパラメーターはフィールドの名前で、2番目は送信するデータの配列、または読み取り用に開かれたファイルのいずれかです。 3番目のパラメーターは、追加のデータ(送信されるパーツのContent-typeを含む)の連想配列にすることができます。



最後に、postContentを呼び出す最後のオプションは、フォームなしでデータを送信することです。 ここでは2つのオプションが可能です。 1つは、ピアツーピアデータ配列(たとえば、ubyte [])の送信です。 この場合、送信時にContent-Lengthヘッダーが使用されるため、呼び出し時の配列の長さを知る必要があります。 ここでは、コールラインのみを提供します。



 auto content = postContent( "http://httpbin.org/post"、 
                         「ABCDEFGH」、 
                         「アプリケーション/バイナリ」);




何らかの理由で呼び出し時の配列の長さがわからない場合(ただし、有限であることはわかっています)、次元2の配列の転送を使用できます。この場合、配列の各連続部分はTransfer-Encodingに別のチャンクとして転送されます:chunked:

Transfer-Encodingを使用してファイルを送信する:chunked
 import std.stdio;
インポート要求;

 void main()
 {
      auto f = File( "source / app.d"、 "rb");
      auto content = postContent( "http://httpbin.org/post"、f.byChunk(5)、 "application / binary");
      writeln(コンテンツ);
 } 




これで、dlang-requestsの最も簡単な使用法の概要は終わりです。デバッグが不要な場合、受信した応答をストリーミングする必要はなく、GETとPOST以外のメソッドは必要ありません。 パート1で考慮されないすべてのものは、パート2で検討します。



githubのプロジェクトリポジトリにリンクします。



頑張って



All Articles