2018年3月25日日曜日

C# UWP WEBサイトの操作

メモ 情報収集中

C# UWPでは、WEBの操作に
Windows.Web.Http.HttpClientクラス
を使うのが一番いいみたいだ。
https://docs.microsoft.com/ja-jp/windows/uwp/networking/httpclient

このHttpClientクラスをインスタンス化したものに自分の扱いたいWEBサイトを代入する。

例えば、インスタンス化されたものをhttpClientとすると、
httpClient.GetAsync(new Uri("http://hogehoge.com"))
とか、
string result = await httpClient.GetStringAsync(new Uri("http://hogehoge.com"));使い終わったら
httpclient.Dispose();と、破棄しておく。

メソッドとしては
GetAsync
PostAsync
PutAsync
DeleteAsync
など。
https://docs.microsoft.com/en-us/uwp/api/windows.web.http.httpclient

注意点
Windows.Web.Http.HttpClientの方が、System.Net.Http.HttpClientよりも新しい。
似ているから最初違いが判らなかったのだけど、
MSによると
「System.Net.Http 名前空間と System.Net.Http.Headers 名前空間は、Windows の将来のバージョンでは Windows ストア アプリ用に使用できないことがあります。」
だそうだ。

Windows.Web.Http.HttpRequestMessageクラス-
Windows.Web.Http.HttpClient から送られた HTTP 要求メッセージ
Windows.Web.Http.HttpResponseMessageクラス
データ受け取り時はこれを使うみたいだ。
普通の受け取りと、あとは、
例えば、ログイン後のサイトの情報を受け取るのには、このクラスをインスタン化したものとHttpClientをインスタンス化したものと組み合わせて使うことでそこでログインした状態を保持した情報を受け取ることができている。
-----------------------
ブラウザの起動の仕方は
https://docs.microsoft.com/en-us/uwp/api/windows.system.launcher
http://coelacanth.jp.net/metrostyleapp入門-vol29-アプリからブラウザを起動する/

private async void Button_Click_1(object sender, RoutedEventArgs e)
        {
            var uri = new Uri("http://www.bing.com");

            var success = await Windows.System.Launcher.LaunchUriAsync(uri);

            if (success)
            {
                // 起動に成功した場合の処理。
                // ブラウザは起動するがアプリも裏で動く
            }
            else
            {

            }
        }

------------------------
VBAのようにDOMを使ってC#からIEを制御する方法。がまとめてあるページ。
http://blog.clockahead.com/2015/06/cie.html
の目次
C#でIEを自動制御しよう
(1) はじめに
(2) プロジェクトの設定
(3) IEを起動する
(4) IEで指定したURLを開く
(5) IEを閉じる
(6) ページの読み込み完了まで待機する
(7) フォーム(テキストボックス)に文字を入力する
(8) ボタンをクリックする
(9) LINQでリンクを取得してクリックして開く
(10) セレクトボックス(メニュー)の選択肢を選択する
(11) チェックボックス(ラジオボタン)にチェックを入れる
(12) 画像をクリックする
(13) 表示しているページタイトル&URLを取得する
(14) フレーム分割されたページを操作する


-----------------------
HTML Agility PackはWEBから必要なデータを読み込むのに適している。
が、
webサイトにデータを入力したり、操作するのには向いていないみたいだ。

そういうことをしたいときは
WebRequest request = WebRequest.Create("http://hogehoge.com/");
などと、WebRequestを使えばいいそうなのだが、
UWPでは
https://docs.microsoft.com/ja-jp/dotnet/framework/network-programming/how-to-request-data-using-the-webrequest-class
にある例のように
GetResponse()や、Close();が使えない。

で、
https://stackoverflow.com/questions/38835974/httpwebrequest-in-uwp-c

In UWP, we have two HttpClient APIs, they are System.Net.Http.HttpClient and Windows.Web.Http.HttpClient. You can choose either of them according to your requirement.
と書いてあった。
System.Net.Http.HttpClientはこれから使われないようなので、
今の最新は、Windows.Web.Http.HttpClienthttps://docs.microsoft.com/ja-jp/windows/uwp/networking/httpclient
なのかな?


で、実際に使うとしたら、Windows.Web.Http.HttpClientになるのか?
ここから、MSの例の写し Windows.Web.Http.HttpClient-------
using System;

var uri = new System.Uri("http://www.bing.com");
using (var httpClient = new Windows.Web.Http.HttpClient())
{
    // Always catch network exceptions for async methods
    try
    {
        string result = await httpClient.GetStringAsync(uri);
    }
    catch (Exception ex)
    {
        // Details in ex.Message and ex.HResult.
    }
}
// Having exited the scope of the using statement, httpClient.Dispose() will be called
// automatically, thus freeing up system resources (the underlying socket, and memory
// used for the object).
-------Windows.Web.Http.HttpClientここまで
https://docs.microsoft.com/en-us/uwp/api/Windows.Web.Http.HttpClient



ここからMSの例の写し System.Net.Http.HttpClient---------------------
 static async void Main()
{

    // Create a New HttpClient object.
    HttpClient client = new HttpClient();

    // Call asynchronous network methods in a try/catch block to handle exceptions
    try 
    {
       HttpResponseMessage response = await client.GetAsync("http://www.contoso.com/");
       response.EnsureSuccessStatusCode();
       string responseBody = await response.Content.ReadAsStringAsync();
       // Above three lines can be replaced with new helper method below
       // string responseBody = await client.GetStringAsync(uri);

       Console.WriteLine(responseBody);
    }  
    catch(HttpRequestException e)
    {
       Console.WriteLine("\nException Caught!"); 
       Console.WriteLine("Message :{0} ",e.Message);
    }

    // Need to call dispose on the HttpClient object
    // when done using it, so the app doesn't leak resources
    client.Dispose(true);
 }
---------------------System.Net.Http.HttpClientここまで
https://msdn.microsoft.com/en-us/library/system.net.http.httpclient(v=vs.110).aspx

0 件のコメント:

コメントを投稿