Windows Store App HTTP通信を振り返る

2,755 views

Published on

Community Open Day 2013 ( CoD2013 ) 大阪会場 Room1 のセッション資料です。
Windows Store App (WinRT) でHTTP通信の方法、コンテンツをダウンロードする方法をまとめています。
#cod2013jp

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,755
On SlideShare
0
From Embeds
0
Number of Embeds
60
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Windows Store App HTTP通信を振り返る

  1. 1. Windows Store AppHTTP通信を振り返る楽しいアプリ制作の会(たのアプ)大場知悟@tworks0
  2. 2. 1自己紹介• 大場知悟(Tomonori Ohba)@tworks本名を強いられているッ!
  3. 3. 2自己紹介• コミュニティー新大阪アプリ開発初級~中級者向け勉強会楽しいアプリ制作の会 主催http://tanoapp.tworks.jp/• Windowsストアアプリ、iOS、Androidアプリを開発する闘うアラフォープログラマ(※体力的に)
  4. 4. 3アプリケーション通信を行うアプリケーション使っていますか?何がありますか?
  5. 5. 4アプリケーションさて今日はWindows 8 Store Appについてしゃべります
  6. 6. 5Windows Store アプリWindows 8はタブレットを前提としたUI≒モバイルユース前提=通信はほぼ必須
  7. 7. 6通信するアプリがないとき~
  8. 8. 7通信するアプリがあるとき~!
  9. 9. 8通信するアプリがないとき~(再)
  10. 10. 9通信するアプリがあるとき~!!(再)
  11. 11. 10アプリケーション通信を行うアプリケーションあれば楽しいですよね。※個人的な感想です
  12. 12. 11アプリケーション通信を行うアプリケーション通信中にProgressとか動かしたりTLを表示したりすると何かやってる感がある!※個人的なry
  13. 13. 12何かやっていると思わせることは大事
  14. 14. 13なので…半ば必須となっている通信処理を一緒につくりましょう!
  15. 15. 14HTTPは手軽で便利• データを取得するならHTTPで十分– テキストデータ、バイナリデータ• データ(not File)の送信もHTTPでOK• 世の中、HTTPのサービスが大多数– ○○APIとか全部HTTPですね
  16. 16. 15しかしHTTP上でやることは色々ある• Cookieを付ける– アカウント認証状態とか• リクエストヘッダーを付ける(UA)– 必要に応じて• Basic認証/Digest認証• 通信タイムアウト
  17. 17. 16通信するだけじゃ終われない• HTTPはデータ(文字列)を取るところまで• 文字列=JSONやXMLなどの文書• JSONやXMLをアプリケーションで使える形にしないとツラい
  18. 18. 17JSONこの配列にアクセスしたいです…{"groupName": "Cod2013 Room2","persons": [{ "name": "Tomonori Ohba", "age": 39 },{ "name": "Chuki Manabe", "age": 45 },{ "name": "Taro Yamada", "age": 31 },{ "name": "Hoge Fuga", "age": 21 }]}
  19. 19. 18XMLここの、ここの、このノードが欲しい…<root><groupName>CoD2013 Room2</groupName><persons><person><name>Tomonori Ohba</name><age>39</age></person><person><name>Chuki Manabe</name><age>45</age>
  20. 20. 19アジェンダ• HTTP通信のユースケースをおさえよう– 単純なGET/POST– Cookieを付ける– リダイレクトのハンドリング– バイナリデータの取得– BackgroundDownloader• 取得したデータを使いやすくしよう– JSON/XML Parse
  21. 21. 20(1)単純なGET/POSTDEMO
  22. 22. 21(1)単純なGETusing (var handler = new HttpClientHandler())using (var httpClient = new HttpClient(handler)){var httpResponseMessage =await httpClient.GetAsync(uri);var content =await httpResponseMessage.Content.ReadAsStringAsync();}
  23. 23. 22(1)単純なPOSTusing (var handler = new HttpClientHandler())using (var httpClient = new HttpClient(handler))using (var formUrlEncodedContent = newFormUrlEncodedContent(queryParams)) // Dictionary<string,string>{var httpResponseMessage =await httpClient.PostAsync(uri, formUrlEncodedContent);var content =await httpResponseMessage.Content.ReadAsStringAsync();}
  24. 24. 23(1)単純なGET/POST3つのクラス(GETは2つ)で構成される• HttpClientHandlerHTTPの通信前後で 処理をフック するもの(後述)• HttpClientHTTP通信の本体• FormUrlEncodedContentPOSTパラメタを構成するもの
  25. 25. 24(2)CookieDEMO
  26. 26. 25(2)Cookieを付けるvar handler = HttpClientHandler();// 単一のCookieを生成var cookie = new Cookie("Key", "Value");// CookieContainerにCookieをセットvar container = new CookieContainer();container.Add(new Uri("somedomain.com"), cookie);// HttpClientHandlerへCookieをセットhandler.CookieContainer = container;
  27. 27. 26(3)リダイレクトのハンドリングDEMO
  28. 28. 27(3)リダイレクトのハンドリングusing (var handler = new HttpClientHandler())using (var httpClient = new HttpClient(handler)){handler.AllowAutoRedirect = false;var res = await httpClient.GetAsync(uri);if (res == HttpStatusCode.Redirect){// res.Headers.Location がリダイレクト先URL}
  29. 29. 28(4)バイナリデータの取得DEMO
  30. 30. 29(4)バイナリデータの取得var stream = awaithttpResponseMessage.Content.ReadAsStreamAsync();var binaryReader = new BinaryReader(stream);var contentBytes = new byte[contentLength]binaryReader.Read(contentBytes, 0, contentBytes.Length);
  31. 31. 30(TIPS)DelegatingHandlerDEMO
  32. 32. 31DelegatingHandlerHttpClientGetAsync()CustomHandleroverride SendAsync()
  33. 33. 32(5)WinRTにダウンロードを委譲BackgroundDownloaderDEMO
  34. 34. 33(5)BackgroundDownloadervar destinationFile = awaitKnownFolders.DocumentsLibrary.CreateFileAsync("save.bin"), CreationCollisionOption.ReplaceExisting);var downloader = new BackgroundDownloader();var download = downloader.CreateDownload(newUri(@"http://somedomain/test/hoge.bin"), destinationFile);await download.StartAsync();
  35. 35. 34BackgroundDownloader• ダウンロード中にアプリを中断・終了するとダウンロードも中断します• アプリケーション再開時に、前回中断したダウンロードを再開する方法もありますWindows 8 アプリ開発者ブログhttp://blogs.msdn.com/b/windowsappdev_ja/archive/2012/05/21/being-productive.aspx
  36. 36. 35取得したデータのオブジェクト化DEMO
  37. 37. 36JSON{"groupName": "Cod2013 Room2","persons": [{ "name": "Tomonori Ohba", "age": 39 },{ "name": "Chuki Manabe", "age": 45 },{ "name": "Taro Yamada", "age": 31 },{ "name": "Hoge Fuga", "age": 21 }]}
  38. 38. 37JSON Parse 受けるPropの作成[DataContract]public class PersonJson{[DataMember(Name="name")]public string Name { get; set; }[DataMember(Name = "age")]public int Age { get; set; }}
  39. 39. 38JSON Parse 受けるPropの作成[DataContract]public class PersonsJson{[DataMember(Name="groupName")]public string GroupName { get; set; }[DataMember(Name="persons")]public List<PersonJson> Persons { get; set; }}
  40. 40. 39JSONのParseとインスタンス化var dataContractJsonSerializer = newDataContractJsonSerializer(typeof(PersonJson));var memoryStream = newMemoryStream(Encoding.Unicode.GetBytes(json));var personJsonInstalce =(PersonJson)dataContractJsonSerializer.ReadObject(memoryStream);
  41. 41. 40GeneicにしちゃえばOKpublic static T ToClass<T>(string json) {var dataContractJsonSerializer = newDataContractJsonSerializer(typeof(T));var memoryStream = newMemoryStream(Encoding.Unicode.GetBytes(json)))return(T)dataContractJsonSerializer.ReadObject(memoryStream);}
  42. 42. 41JSONの要素アクセス// LINQでよろしくvar me = (from person in json.Personswhere person.Name == "Tomonori Ohba"select person).FirstOrDefault();
  43. 43. 42XML Parsevar xdoc = XDocument.Parse(xml);
  44. 44. 43XMLのNodeアクセス// LINQでよろしくvar me = (from person in xdoc.Descendants("person")where person.Element("name").Value == "Tomonori Ohba“select person).FirstOrDefault();
  45. 45. 44取得したデータの加工• JSONはDataContractでオブジェクト化が可能変換後のクラスをあらかじめ用意するのが面倒(インテリセンスが効くメリットがあります)• シリアライズ時に、DataMemberで指定したNameが、JSONオブジェクト名に紐づけられます• XMLはXdocumntでシリアライズ、Node探索はゴリ系
  46. 46. 45まとめ
  47. 47. 46まとめ• テキストデータを取得するならHttpClient#GetAsync/PostAsyncで• HTTPの上に乗るProtocolを実装するときはDetegatingHandler• 取ってきてファイルに出すならBackgroundDownloader• JSON/XMLは良しなにParse~Linqで料理
  48. 48. 47素敵なアプリを作りましょう!
  49. 49. 48ご清聴ありがとうございました。

×