Your SlideShare is downloading. ×
Windows Store App HTTP通信を振り返る
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Windows Store App HTTP通信を振り返る

1,763
views

Published on

Community Open Day 2013 ( CoD2013 ) 大阪会場 Room1 のセッション資料です。 …

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
1,763
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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

×