徐々に、
C#と
.NET Frameworkの研究により、たった1つのメソッドの呼び出しの背後にルーチンコードを隠すさまざまなヘルパーを作成し始めました。 その後、それは完全なライブラリの開発に変わりました。これを紹介します。 このライブラリは完全にゼロから書かれています。
xNetとは何ですか?
xNetは
.NET Frameworkのクラスライブラリであり、次のものが含まれます。
- プロキシサーバーを操作するためのクラス: HTTP、Socks4(a)、Socks5、Chain 。
- HTTP 1.0 / 1.1プロトコルを操作するためのクラス: キープアライブ、gzip、deflate、チャンク、SSL、プロキシなど 。
ダウンロード:
リリースソース:
github.com/X-rus/xNetこの記事は、ライブラリの新しいバージョンのリリースに関連して大幅に書き直されました。 最終更新
日2015/12/09基本
HttpRequestは要求を送信するために使用されます。 その中で、ヘッダー、タイムアウト、転送に従うかどうか、永続的な接続を維持するかどうかなど、さまざまな設定を設定できます。 要求を送信すると、最初に
HttpResponseを使用して応答ヘッダーを受け入れ、次にメッセージオブジェクトをロードできるようにこのオブジェクトへのリンクを返します。 特別な方法のいずれかを使用して、メッセージ本文をダウンロードできます。
リクエストの例:
using (var request = new HttpRequest()) { request.UserAgent = Http.ChromeUserAgent();
usingステートメントは、サーバーへの接続を閉じるために使用されます。
HttpRequest.Closeメソッドを呼び出すことでも同じことができます。
HttpRequest.Responseプロパティを使用して、
HttpResponseへのリンクを取得することもできます。 返されるHttpResponseは一意ではありません。 各HttpRequestには、HttpResponseが1つしかありません(すべての要求で再利用されます)。
これはリクエストがどのように見えるかです GET / HTTP/1.1 Host: habrahabr.ru Connection: keep-alive Accept-Encoding: gzip,deflate User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/24.0.1309.0 Safari/537.17
簡単なリクエストを送信し、メッセージ本文をロードする
GETリクエストの例:
using (var request = new HttpRequest()) { var urlParams = new RequestParams(); urlParams["param1"] = "val1"; urlParams["param2"] = "val2"; string content = request.Get("habrahabr.ru", urlParams).ToString(); }
RequestParamsは、 URLパラメーターを設定するために使用されます。 この場合、これは次のエントリと同等です。
Get("habrahabr.ru/?param1=val1¶m2=val2")
HttpRequest.AddUrlParamメソッドを使用してURLパラメーターを設定できます。 これらのパラメーターは、最初の要求後に消去されます。
一時URLパラメーターを使用したGETリクエストの例:
using (var request = new HttpRequest()) { request.AddUrlParam("param1", "val1").AddUrlParam("param2", "val2"); string content = request.Get("habrahabr.ru").ToString(); }
POSTリクエストの例:
using (var request = new HttpRequest()) { var reqParams = new RequestParams(); reqParams["login"] = "neo"; reqParams["password"] = "knockknock"; string content = request.Post( "www.whitehouse.gov", reqParams).ToString(); }
HttpRequest.AddParamを使用して要求パラメーターを設定でき
ます 。 これらのパラメーターは、最初の要求後に消去されます。
一時的なパラメーターを使用したPOSTリクエストの例:
using (var request = new HttpRequest()) { request.AddParam("login", "neo").AddParam("password", "knockknock"); string content = request.Post("www.whitehouse.gov").ToString(); }
文字列、バイトの配列、ファイル、または
HttpContentを継承するオブジェクトを送信することもできます。
5つの
HttpResponseメソッド(
ToString 、
ToBytes 、
ToFile 、
ToStreamまたは
ToMemoryStream )の
いずれかを使用してメッセージ本文を読み込みます。 メッセージ本文が必要ない場合は、
Noneメソッドを呼び出す必要があります。
たとえば、リクエストパラメータを1251エンコードでエンコードする場合、プロパティ
HttpRequest.CharacterSet = Encoding.GetEncoding(1251)を設定する必要があります。
マルチパート/フォームデータの送信
マルチパート/フォームデータについて。 それらを使用するには、
MultipartContentクラスを使用します。
マルチパート/フォームリクエストの例:
using (var request = new HttpRequest()) { var multipartContent = new MultipartContent() { {new StringContent("Bill Gates"), "login"}, {new StringContent("qwerthahaha"), "password"}, {new FileContent(@"C:\windows_9_alpha.rar"), "file1", "1.rar"} }; request.Post("www.microsoft.com", multipartContent).None(); }
MultipartContentクラスのオブジェクトを自分で作成しないために、
AddFieldと
AddFileの 2つの特別な
HttpRequestメソッドを使用できます。 これらのパラメーターは、最初の要求後に消去されます。
時間パラメータを使用したマルチパート/フォームリクエストの例:
using (var request = new HttpRequest()) { request .AddField("login", "Bill Gates") .AddField("password", "qwerthahaha") .AddFile("file1", @"C:\windows_9_alpha.rar"); request.Post("www.microsoft.com").None(); }
永続的な接続と再接続
HttpRequestは永続的な接続をサポートします。
HttpRequest.KeepAliveプロパティを使用して無効にすることができます。
例:
using (var request = new HttpRequest("habrahabr.ru")) { request.Get("/").None(); request.Get("/feed").None(); request.Get("/feed/posts"); }
3つの要求はすべて同じ接続を使用して実行されますが、これはサーバーが以前に接続を閉じなかった場合のみです。 最後のリクエストでは、
Noneメソッドを呼び出さないことに注意してください。 実際には、永続的な接続を使用しているときに次のリクエストを正しく実行できるようにメッセージ本文をロードします。これは最後のリクエストであるため、接続が閉じられるためメッセージ本文をダウンロードできません。
Noneメソッドについてもう少し説明します。 永続的な接続が使用されていない場合、このメソッドは単に接続を閉じます。 このメソッドを呼び出さない場合、次のリクエストで自動的に呼び出されます。 このメソッドを自分で呼び出すことをお勧めします。
永続的な接続を使用する場合、サーバーから切断される可能性があることに注意してください。 これは、サーバーが1つの接続の要求の制限に達したか、次の要求のタイムアウトが期限切れになったために発生する可能性があります。
HttpRequestは、再接続を試みることでこのような状況に対処できます(この動作は
Reconnectとは関係ありません)。 接続に失敗すると、例外がスローされます。 永続的な接続をより細かく調整するには、
KeepAliveTimeout プロパティと
MaximumKeepAliveRequestsプロパティを使用でき
ます 。
さらに、
Reconnect 、
ReconnectLimit、および
ReconnectDelayプロパティを使用して
再接続を管理できます。 デフォルトでは、この動作は無効になっています。 サーバーへの接続中にエラーが発生した場合、またはデータのアップロード/ダウンロード中にエラーが発生した場合、
HttpRequestは再接続を試みます。 ただし、メッセージ本文の読み込み中にエラーが発生した場合(ToString()メソッドなど)、再接続は機能しません。 この動作は、プロキシを使用する場合、またはインターネット接続が不安定な場合に便利です。
Cookie、ヘッダーなどを設定する
追加のヘッダーは、特別なインデクサーを使用して設定されます。 一部のヘッダーは特別なプロパティを使用してのみ設定できることに注意してください。 それらのリストはドキュメントにあります。 インデクサーを介して指定されたヘッダーは、すべてのリクエストで送信されます。 1つのリクエストに一時ヘッダーを設定する必要がある場合は、
HttpRequest.AddHeaderメソッドを使用し
ます 。 このようなヘッダーは、インデクサーを介して指定されたヘッダーとオーバーラップします。
Cookieは、
HttpRequest.Cookiesプロパティを使用して設定されます。 Cookieは、サーバーの応答に応じて異なる場合があります。 これを防ぐには、
CookieDictionary.IsLockedプロパティの値を
trueに設定し
ます 。
例:
using (var request = new HttpRequest("habrahabr.ru")) { request.Cookies = new CookieDictionary() { {"hash", "yrttsumi"}, {"super-hash", "df56ghd"} }; request[HttpHeader.DNT] = "1"; request["X-Secret-Param"] = "UFO"; request.AddHeader("X-Tmp-Secret-Param", "42"); request.AddHeader(HttpHeader.Referer, "http://site.com"); request.Get("/"); }
HttpRequestおよび
HttpResponseには、Cookieおよびヘッダーを操作するための追加メソッドがあり
ます :
ContainsHeader 、
EnumerateHeaders 、
ClearAllHeaders 、
ContainsCookie 、
ContainsRawCookieなど。
要求を送信するには、User-Agentを設定する必要があります。
IEUserAgent 、
OperaUserAgent 、
ChromeUserAgent 、
FirefoxUserAgentまたは
OperaMiniUserAgentの いずれかの
Httpメソッドによって生成できます。
そして、このように尋ねます:
request.UserAgent = Http.ChromeUserAgent();
以前は
RandomUserAgentメソッドがありましたが、使用すると問題が発生する可能性があるため、削除しました。 Google Chromeのサイトは1つのコンテンツを生成しますが、IEのサイトは少し異なるか、まったく異なるとしましょう。 そのため、さまざまなブラウザのユーザーエージェントを注意して使用してください。
HttpRequestには、送信されるヘッダーを操作するために使用できるより多くのプロパティがあります。 ドキュメントを参照してください。
プロキシ接続
xNetは、次のタイプのプロキシをサポートしています。
- HTTP-クラスHttpProxyClient
- Socks4(a) -クラスSocks4ProxyClient(a)
- Socks5-クラスSocks5ProxyClient
これらのクラスはすべて、
ProxyClientクラスを継承します。 追加のクラス
ChainProxyClientがあり、プロキシのチェーンを介して接続を作成できます。
例:
var proxyClient = HttpProxyClient.Parse("127.0.0.1:8080"); var tcpClient = proxyClient.CreateConnection("habrahabr.ru", 80);
HttpRequestは、プロキシサーバーを介した作業をサポートします。 これを行うには、
HttpRequest.Proxyプロパティを設定します。
エラー処理
HTTPプロトコルでの作業中にエラーが発生した場合
、 HttpExceptionが
スローされ 、プロキシサーバーでの作業中にエラーが発生した場合、
ProxyExceptionが
スローされます。 これらの例外は両方とも、
NetExceptionクラスから継承します。
例:
try { using (var request = new HttpRequest()) { request.Proxy = Socks5ProxyClient.Parse("127.0.0.1:1080"); request.Get("habrahabr.ru"); } } catch (HttpException ex) { Console.WriteLine(" HTTP-: {0}", ex.Message); switch (ex.Status) { case HttpExceptionStatus.Other: Console.WriteLine(" "); break; case HttpExceptionStatus.ProtocolError: Console.WriteLine(" : {0}", (int)ex.HttpStatusCode); break; case HttpExceptionStatus.ConnectFailure: Console.WriteLine(" HTTP-."); break; case HttpExceptionStatus.SendFailure: Console.WriteLine(" HTTP-."); break; case HttpExceptionStatus.ReceiveFailure: Console.WriteLine(" HTTP-."); break; } }
追加のクラス
WinInetクラスを使用すると、Windowsオペレーティングシステムのネットワーク設定を操作できます。 これにより、コンピューターがインターネットに接続されているかどうかを確認したり、Internet Explorerプロキシサーバーの値を取得したりできます。
Htmlクラスは、
HTMLおよびその他のテキストデータを支援するように設計されてい
ます 。 テキスト内の
HTMLエンティティを、それらを表す文字で置き換えるメソッドが含まれています。 例:&_quot; test&_quot; 「テスト」で。 Unicodeエンティティを、それらを表す文字で置き換えるメソッド。 例:\ u2320または\ U044F。 文字列を抽出するためのメソッド:Substring、LastSubstring、Substrings。
関連リンク