C# exercises (d) REST & JSON

Visual Studio community 2015 アカウントについて (学内専用)

  1. WebBrowser (基本)
  2. Form(自動操作)
  3. HttpClient
  4. REST & JSON ←今週

RESTとは

RESTとは、RESTはREpresentational State Transferの略。2000年にRoy Fielding氏が提唱した、分散システムにおいて複数のソフトウェアを連携させるのに適した設計原則の集合。また、狭義には、それをWebに適用したソフトウェアの設計様式のこと。一般には後者の意味で用いられることがほとんどである。RESTの世界では、ネットワーク上のコンテンツ(リソース)を一意なURLで表すのが基本。各リソース(URL)に対してGET,POST,PUT,DELETEでリクエストを送信しレスポンスをXMLやjsonなどで受け取る形式(レスポンスのフォーマット形式は指定されていない)。

REST APIをを作る前に先人はどのような設計をしていたのかを見てみましょう。今ではTwitterやfacebook,Github、Amazonなど大きいところではだいたいAPIを提供しているので、お手本は山ほどあります。URL設計やリクエスト・レスポンス、HTTPヘッダなどに着目して見比べてみましょう。

Twitter REST API
レスポンスの情報量が多いので、どういった情報を返すべきか参考になります。
Github API
一番綺麗にまとまっているAPIだと思います。リクエスト・レスポンスがRESTらしく、とても綺麗。

JSONとは

JSONとは、JavaScriptにおけるオブジェクトの表記法を応用したデータ形式。 JSONで表記されたデータは、JavaScript上ではコードとして実行するだけで読み込みが完了する。JSONでは、データ全体を配列またはJavaScriptにおけるオブジェクト(キーと値のペアを列挙した構造体)として記述する。

JSONというのは「データを表現するための記法(≒文法)」です。シンプルなデータであれば、文法など気にせずにただ書けば問題ありません。少々複雑でも、我々は「表」という記法をしっているため、ある程度の複雑さには対応できます。しかし、表で表すのが困難な程度の複雑な構造を持つデータを表現しなければならないことは多々あります。このように、表形式では表現が困難な構造のデータを、人間に対するある程度の可読性を残しつつ、コンピュータに対しても伝達できるような記法、その1つがJSONです。そしてJSON形式で記述したデータのことを、JSON-textといいます。

chenlabのメンバーをJSON-textで表現

{
“name”   : “chenlab”,
“member3” : [ “14TE485”, “14TE406”, “14TE410”, “14TE449” , “14TE461″”, “14TE465″”, “14TE470”],
“member4” : [ “13TE466”, “13TE477”, “13TE486”, “13TE520” , “12TE412″”, “13TE457″”, “13TE405”],
“count”  : 4
}

 

C#でJSON

Newtonsoft.Jsonのインストール

C#でJSON扱うときは、いくつ方法があり、ここはNewtonsoft.Jsonののライブラリを使う。

NuGetパッケージ管理を開く

nuget

Newtonsoft.Jsonを選択して、インストールしてください。

2016-07-14

 

JSONデータサンプル

http://wp-api.xyz/wp-json/posts

先週のプログラムでサンプルデータを取得するように変更してください。

ダウンロード:web_get2 (2)

JSONをクラスとして貼り付け

JSONのデータ構造をC#のクラス定義に変換する。

取得したサンプルデータをコピーして、メニューの「JSONをクラスとして貼り付け」で、プログラムのnamespaceの最後部に貼り付けください。

jsonpaste

JSONプログラミング

16 行に下記の分を入れえてください

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Linq;

デザイン画面に、「button1」ボタンと、「listBox1」リストボックスを追加してください。

デザインのbutton1をダブルクリックし、DeserializeObject処理を入れてください。

private void button1_Click(object sender, EventArgs e)
{
    var json = HTTP_Results.Text;
    var posts = JsonConvert.DeserializeObject<Class1[]>(json);
    foreach(Class1 post in posts)
    {
        listBox1.Items.Add(post.ID);
    }
    // string saveJson = JsonConvert.SerializeObject(posts, Formatting.Indented);

}

実行画面

これて、Jsonデータ(ブログの投稿)の取得、Deserialize、そして(ブログID)表示ができた。

スクリーンショット 2016-07-15 11.35.51

最終プログラム構造

  • Namespace web_get2
    • Class Form1 : Form
      • Form1
      • Quit_Click
      • Request_Click
      • button1_Click
    • Class Rootobject (JSON データ構造)
    • Class Meta (JSON データ構造)
    • Class Links (JSON データ構造)
    • Class Terms (JSON データ構造)
    • 。。。

最終プログラム

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
// for httpclient
using System.Net.Http;
using System.Net;
using System.IO;
using System.Runtime.Serialization;
// using System.Runtime.Serialization.Json;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Linq;

namespace web_get2
{


    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Quit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private async void Request_Click(object sender, EventArgs e)
        {
            if (ProxyOn.Checked)
            {
                // デフォルト プロキシ情報を取得して、資格情報を設定する 
                var proxy = WebRequest.DefaultWebProxy;
                proxy.Credentials = new NetworkCredential(ProxyID.Text, ProxyPW.Text);
            }
            var client = new HttpClient();
            string response = await client.GetStringAsync(URL.Text);
            HTTP_Results.Text = response;

        }

        private void button1_Click(object sender, EventArgs e)
        {
            var json = HTTP_Results.Text;
            var posts = JsonConvert.DeserializeObject<Class1[]>(json);
            foreach (Class1 post in posts)
            {
                listBox1.Items.Add(post.ID);
            }
            // string saveJson = JsonConvert.SerializeObject(posts, Formatting.Indented);
        }
    }


    public class Rootobject
    {
        public Class1[] Property1 { get; set; }
    }

    public class Class1
    {
        public int ID { get; set; }
        public string title { get; set; }
        public string status { get; set; }
        public string type { get; set; }
        public object author { get; set; }
        public string content { get; set; }
        public object parent { get; set; }
        public string link { get; set; }
        public DateTime date { get; set; }
        public DateTime modified { get; set; }
        public string format { get; set; }
        public string slug { get; set; }
        public string guid { get; set; }
        public string excerpt { get; set; }
        public int menu_order { get; set; }
        public string comment_status { get; set; }
        public string ping_status { get; set; }
        public bool sticky { get; set; }
        public string date_tz { get; set; }
        public DateTime date_gmt { get; set; }
        public string modified_tz { get; set; }
        public DateTime modified_gmt { get; set; }
        public Meta meta { get; set; }
        public object featured_image { get; set; }
        public Terms terms { get; set; }
    }

    public class Meta
    {
        public Links links { get; set; }
    }

    public class Links
    {
        public string self { get; set; }
        public string author { get; set; }
        public string collection { get; set; }
        public string replies { get; set; }
        public string versionhistory { get; set; }
    }

    public class Terms
    {
        public Category[] category { get; set; }
    }

    public class Category
    {
        public int ID { get; set; }
        public string name { get; set; }
        public string slug { get; set; }
        public string description { get; set; }
        public string taxonomy { get; set; }
        public object parent { get; set; }
        public int count { get; set; }
        public string link { get; set; }
        public Meta1 meta { get; set; }
    }

    public class Meta1
    {
        public Links1 links { get; set; }
    }

    public class Links1
    {
        public string collection { get; set; }
        public string self { get; set; }
    }
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA


Related Post

C# exercises (e) Open DataC# exercises (e) Open Data

オープンデータを利用したWebアプリ作成 オープンデータとは オープンデータ(Open Data)とは、特定のデータが、一切の著作権、特許などの制御メカニズムの制限なしで、全ての人が望むように利用・再掲載できるような形で入手できるべきであるというアイデアである。 オープンデータの利用 「LinkData.org」には、誰でも無償で利用でき、商用利用も可能なオープンデータが豊富にまとまっています。 都道府県別で探したり、人気ランキングやキーワードを指定しての検索もできるので、自分が興味のあるデータを探すのも簡単でしょう。 LinkDataのサイト内には、全国の「お城データ」や「道の駅データ」、「避難所データ」、「補助金まとめデータ」、「さくら名所データ」…など、意外とユニークで面白いデータがまとまっているので、うまく利用すれば楽しいWebアプリが作れそうです。 「ダウンロード」の項目下に、「その他の形式のAPIリストを表示」というリンクがあるのでクリックします。 すると、外部APIとしてデータが取得できるURLが一覧表示されます。 そこで「JSON」形式のURLをコピーして、実際にブラウザのアドレスバーに入力してみましょう! あとは、このデータをC#を使って、自分のWebアプリに組み込めば良い。 グループ課題 オープンデータを利用したWebアプリの作成 オープンデータの選択 郵便番号検索 天気予報検索 その他 オープンデータをブラウザで確認 C#を使って、オープンデータWebアプリの作成

C# exercises (8) Puzzle Game2C# exercises (8) Puzzle Game2

先週できたパズルゲームUIの改進 参考 http://www18.big.or.jp/~neon2/bunkatu/tips9.shtml 改進点: ピースを順番でセットするではなく、あらかじめランダムにセットして、マウス移動できるようにする ピースをあらかじめランダムにセット initialData の改造 PlayBox_Paint の改造 マウス移動できる 勝負判定 経過時間の表示

C# exercises (a) Web1 WebBrowserC# exercises (a) Web1 WebBrowser

Visual Studio community 2015 アカウントについて (学内専用) 今週から、4回分けてWebについて学習する WebBrowser (基本) WebBrowser (自動操作) HttpClient REST & JSON WebBrowser コントロール WebBrowser コントロールを利用した、シンプルなアプリケーションの作成手順を紹介します。 Visual Studioを起動し、新しいWindows Formプロジェクトを作成します。 WebBrowserコントロールの配置 […]