REST Webサービスを呼び出す - C#

C#でRESTのWebサービスを呼び出すコードを紹介します。

概要

C#でREST形式のインターフェイスを持つWebサービス(WebAPI)を呼び出すコードを紹介します。RESTの呼び出しの場合は、HTTPのアクセスでパラメータの送信とレスポンスの処理のコードの記述が必要になります。

プログラム例

Windows Formアプリケーションを作成します。

事前準備

サービスの実装

RESTインターフェイスのWebサービスを実装します。今回はこちらの記事で作成した、RESTインターフェイスを持つWCFサービスを準備しました。

アセンブリの参照

System.Runtime.Serialization.Json のクラスを利用するため、ソリューションエクスプローラーでアセンブリの参照を追加します。System.Runtime.Serialization アセンブリをアセンブリ参照に追加します。

UI

下図のUIを作成します。テキストボックスを4つ、ボタンを2つフォームに配置します。

コード

下記のコードを記述します。
FormMain.cs
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;
using System.Net;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Text.RegularExpressions;

namespace WcfRestServiceCall
{

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

    private void button1_Click(object sender, EventArgs e)
    {
      string url = string.Format("http://localhost:52063/RestService/add/{0}/{1}", textBox1.Text, textBox2.Text);
      HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
      req.Method = "GET";
      HttpWebResponse res = (HttpWebResponse)req.GetResponse();

      for (int i = 0; i < res.Headers.Count; i++) {
        textBox4.Text += res.Headers[i] + "\r\n";
      }

      Stream s = res.GetResponseStream();
      StreamReader sr = new StreamReader(s);
      string content = sr.ReadToEnd();

      textBox4.Text += "\r\n\r\n-----------\r\n\r\n\r\n";
      textBox4.Text += content;

      Regex reg = new Regex("^\"(?<value>.*)\"$");
      Match match = reg.Match(content);

      textBox3.Text = match.Groups["value"].Value;
    }

    private void button2_Click(object sender, EventArgs e)
    {
      string postData = string.Format("{{\"value1\":\"{0}\", \"value2\":\"{1}\"}}", textBox1.Text, textBox2.Text);

      HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:52063/RestService/addi");
      req.Method = "POST";

      byte[] byteArray = Encoding.UTF8.GetBytes(postData);
      req.ContentType = "application/json";
      req.ContentLength = byteArray.Length;

      Stream dataStream = req.GetRequestStream();
      dataStream.Write(byteArray, 0, byteArray.Length);
      dataStream.Close();

      HttpWebResponse res = (HttpWebResponse)req.GetResponse();

      for (int i = 0; i < res.Headers.Count; i++) {
        textBox4.Text += res.Headers[i] + "\r\n";
      }
      textBox4.Text += "\r\n\r\n-----------\r\n\r\n\r\n";

      Stream s = res.GetResponseStream();
      DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(AddStringInverseResponse));
      AddStringInverseResponse ar = (AddStringInverseResponse)serializer.ReadObject(s);
      textBox3.Text = ar.result + " : " + ar.resultid.ToString();

    }
  }
}

AddStringInverseResponse.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WcfRestServiceCall
{
  [System.Runtime.Serialization.DataContract]
  public class AddStringInverseResponse
  {
    [System.Runtime.Serialization.DataMember()]
    public string result { get; set; }

    [System.Runtime.Serialization.DataMember()]
    public int resultid { get; set; }
  }
}

解説:button1の動作 (AddString Webメソッドの呼び出し)

AddString Webメソッドはサービスの実装でUriTemplateで"add"と定義されているため、http://(サーバーのドキュメントルート)/(サービス名)/addi URLがエンドポイントとなります。パラメーターはURLの末尾に/区切りで追加します。(ディレクトリ名を記述するようにパラメーターを指定します。)

下記のコードでHttpWebRequestオブジェクトを作成し、Web APIにアクセスしレスポンスを取得します。
  string url = string.Format("http://localhost:52063/RestService/add/{0}/{1}", textBox1.Text, textBox2.Text);
  HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
  req.Method = "GET";
  HttpWebResponse res = (HttpWebResponse)req.GetResponse();

下記のコードはレスポンスのヘッダをテキストボックスに表示するコードです。
  for (int i = 0; i < res.Headers.Count; i++) {
    textBox3.Text += res.Headers[i] + "\r\n";
  }

レスポンスのボディ(データ)部分を下部のテキストボックスに表示するコードです。レスポンスのボディ(データ)はストリームで取得します。
  Stream s = res.GetResponseStream();
  StreamReader sr = new StreamReader(s);
  string content = sr.ReadToEnd();

  textBox3.Text += "\r\n\r\n-----------\r\n\r\n\r\n";
  textBox3.Text += content;

レスポンスの文字列は「"」(ダブルクォーテーション)で囲まれているため、「"」を除去して囲まれている内部の値をテキストボックスに表示します。
  Regex reg = new Regex("^\"(?<value>.*)\"$");
  Match match = reg.Match(content);

  textBox3.Text = match.Groups["value"].Value;

解説:button2の動作 (AddStringInverse Webメソッドの呼び出し)

POSTするJSONの文字列を準備します。
  string postData = string.Format("{{\"value1\":\"{0}\", \"value2\":\"{1}\"}}", textBox1.Text, textBox2.Text);

AddStringInverse メソッドはvalue1, value2 2つのパラメーターをPOSTで渡すため、下記のJSONを渡します。
{
  "value1" : "value1の値",
  "value2" : "value2の値"
}

下記のコードにより、HttpWebRequest オブジェクトを作成し、Web APIのURLにアクセスします。
AddStringInverse を呼び出すURLはサービス側のUriTemplateにて"addi"と定義されているため、http://(サーバーのドキュメントルート)/(サービス名)/addi URLがエンドポイントとなります。
AddStringInverse WebAPIはPOSTでのアクセスとなるため、Methodプロパティには"POST"を設定します。また、GetRequestStremメソッドを呼び出しStramを取得し、POSTする文字列をストリームに書き込むことで送信します。
  HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:52063/RestService/addi");
  req.Method = "POST";

  byte[] byteArray = Encoding.UTF8.GetBytes(postData);
  req.ContentType = "application/json";
  req.ContentLength = byteArray.Length;

  Stream dataStream = req.GetRequestStream();
  dataStream.Write(byteArray, 0, byteArray.Length);
  dataStream.Close();

  HttpWebResponse res = (HttpWebResponse)req.GetResponse();

受け取ったレスポンスHttpWebResponse オブジェクトの情報を表示します。レスポンスヘッダの内容をテキストボックスに表示します。
  for (int i = 0; i < res.Headers.Count; i++) {
    textBox4.Text += res.Headers[i] + "\r\n";
  }
  textBox4.Text += "\r\n\r\n-----------\r\n\r\n\r\n";

また、レスポンスのデータ(ボディ)部はJSON形式の文字列が返るため、JSONのシリアライズにより、JSONの文字列をパージングします。JSONのシリアライズについてはこちらの記事を参照してください。
  Stream s = res.GetResponseStream();
  DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(AddStringInverseResponse));
  AddStringInverseResponse ar = (AddStringInverseResponse)serializer.ReadObject(s);
  textBox3.Text = ar.result + " : " + ar.resultid.ToString();

  [System.Runtime.Serialization.DataContract]
  public class AddStringInverseResponse
  {
    [System.Runtime.Serialization.DataMember()]
    public string result { get; set; }

    [System.Runtime.Serialization.DataMember()]
    public int resultid { get; set; }
  }

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


上部のテキストボックスに入力文字列を入力します。今回は「ぺんぎん」と「ジャンプ」の文字列を入力します。


[button1]をクリックします。AddStringメソッドが呼び出され、入力文字列が連結された文字列がメソッドの戻り値として返ります。


再度プログラムを実行します。上部のテキストボックスには別の入力文字列を入力します。今回は「かるがも」と「ホップ」の文字列を入力します。


[button2]ボタンをクリックします。AddStringInverseメソッドが実行され、2番目の入力文字列に1番目の入力文字列が連結された文字列が返ります。また乱数の数値も戻り値として戻ります。戻り値はJSONのオブジェクトとして返り、JSONのデシリアライズによりメンバの値が取得できていることが確認できます。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2018-06-01
作成日: 2018-05-31
iPentec all rights reserverd.