3

RWH から http://book.realworldhaskell.org/read/extended-example-web-client-programming.html

ここで使用する HTTP ライブラリは、HTTP の結果を遅延して読み取りません。その結果、ポッドキャストなどの大きなファイルをダウンロードするときに大量の RAM が消費される可能性があります。この制限がない他のライブラリが利用可能です。安定性があり、インストールが簡単で、適度に使いやすいため、これを使用しました。深刻な HTTP のニーズには、Hackage から入手できる mini-http をお勧めします。

mini-http は、ハックでは非推奨です。質問は簡単です。http リクエストを実行し、レスポンス本文を完全にメモリにロードせずに消費するための API を提供するパッケージを知っていますか。

私が欲しいのは、反復処理によって変換できるストリームを提供する API です。簡単な例として、応答のバイト数を数えます。

たぶん反復ベースのAPIですか?

4

2 に答える 2

2

クライアント側でファイルをストリームとしてダウンロードしたいですか? download-curl の遅延インターフェースはどうですか?

あなたのニーズに合っているかもしれません(または少し微調整してください)。

于 2010-06-20T20:01:40.230 に答える
2

一般に、バリデーションで何かを遅延して解析することに関連する一般的な問題があります。「Content-Length」ヘッダーを含む HTTP 応答を受信した場合、接続が閉じられる前にそのすべてのデータを読み取ることを確認する必要があります。つまり、最後まで読んでみないと、そのレスポンスが正しいとは言えません。そして、マッピングは待機してから結果全体を処理する必要があります。
ライブラリの厳密性が低くなり、ヘッダーの正確性とおそらくデータの最初の部分 (チャンクまたは圧縮されている場合) のみをチェックし、「Content-Length」以下の長さの本文を返すことを回避します。または、最後のチャンクとして成功または失敗を返す独自のチャンク ストリームを使用することもできます。
もう 1 つのアプローチは、読み取り時に応答を処理するために CPU を犠牲にすることです (モナド内など)。次の読み取りに有効なデータがない場合は、以前の計算をすべて中止します。

http-monadも参照することをお勧めします。使用したことはありませんが、モナドインターフェースで最後のアプローチを実装することを願っています。

于 2010-06-21T04:44:25.853 に答える