xNet-C#Webライブラリ

徐々に、 C#.NET Frameworkの研究により、たった1つのメソッドの呼び出しの背後にルーチンコードを隠すさまざまなヘルパーを作成し始めました。 その後、それは完全なライブラリの開発に変わりました。これを紹介します。 このライブラリは完全にゼロから書かれています。

xNetとは何ですか?


xNetは.NET Frameworkのクラスライブラリであり、次のものが含まれます。


ダウンロード: リリース
ソース: github.com/X-rus/xNet

この記事は、ライブラリの新しいバージョンのリリースに関連して大幅に書き直されました。 最終更新日2015/12/09

基本


HttpRequestは要求を送信するために使用されます。 その中で、ヘッダー、タイムアウト、転送に従うかどうか、永続的な接続を維持するかどうかなど、さまざまな設定を設定できます。 要求を送信すると、最初にHttpResponseを使用して応答ヘッダーを受け入れ、次にメッセージオブジェクトをロードできるようにこのオブジェクトへのリンクを返します。 特別な方法のいずれかを使用して、メッセージ本文をダウンロードできます。

リクエストの例:
using (var request = new HttpRequest()) { request.UserAgent = Http.ChromeUserAgent(); //  . HttpResponse response = request.Get("habrahabr.ru"); //      . string content = response.ToString(); } 

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&param2=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メソッド( ToStringToBytesToFileToStreamまたは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クラスのオブジェクトを自分で作成しないために、 AddFieldAddFileの 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プロパティを使用できます

さらに、 ReconnectReconnectLimit、および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およびヘッダーを操作するための追加メソッドがありますContainsHeaderEnumerateHeadersClearAllHeadersContainsCookieContainsRawCookieなど。

要求を送信するには、User-Agentを設定する必要があります。 IEUserAgentOperaUserAgentChromeUserAgentFirefoxUserAgentまたはOperaMiniUserAgentの いずれかのHttpメソッドによって生成できます。
そして、このように尋ねます:
 request.UserAgent = Http.ChromeUserAgent(); 


以前はRandomUserAgentメソッドがありましたが、使用すると問題が発生する可能性があるため、削除しました。 Google Chromeのサイトは1つのコンテンツを生成しますが、IEのサイトは少し異なるか、まったく異なるとしましょう。 そのため、さまざまなブラウザのユーザーエージェントを注意して使用してください。

HttpRequestには、送信されるヘッダーを操作するために使用できるより多くのプロパティがあります。 ドキュメントを参照してください。

プロキシ接続


xNetは、次のタイプのプロキシをサポートしています。

これらのクラスはすべて、 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。

関連リンク


Source: https://habr.com/ru/post/J146475/


All Articles