niftyクラウドmobile backendのREST APIをC#から叩いてPush通知登録

niftyクラウドのREST APIを利用するには、シグネチャを生成する必要がある。
http://mb.cloud.nifty.com/doc/current/rest/common/signature.html

C#からシグネチャを生成して（生成後はその文字列を利用）、Push通知登録するまでのコード（コンソールアプリ）を書いた。

REST APIをたたくためにRestSharpを利用（NuGetから入れる）。
http://restsharp.org/

また、ハッシュ値を生成してBase64エンコードする部分では、以下のサイトにあったCreateToken関数を利用。
http://www.jokecamp.com/blog/examples-of-creating-base64-hashes-using-hmac-sha256-in-different-languages/#csharp

さらに、JSON形式を取り扱うためにDymamicJSONを利用（DynamicJson.csをプロジェクトに追加）。
http://neue.cc/2010/04/30_256.html


注意：
* キーの部分は、＜入れる＞としてある
* 関数化しきれてない部分あり（PushNotification関数の引数にsignatureを入れてるが、内部でキー決め打ちとか）


```csharp:Prgram.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using RestSharp;
using System.Security.Cryptography;
using System.Web.Script.Serialization;
using Codeplex.Data;

namespace ConsoleApp_PushSendTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Send PushMessage using nifty cloud REST API\n");

            Console.WriteLine("Input title");
            string str_title = Console.ReadLine();
            Console.WriteLine("Input message");
            string str_message = Console.ReadLine();
            Console.WriteLine("Input URL [defaut: http://www.google.com/]");
            string str_URL = Console.ReadLine();
            Console.WriteLine("Use dialog ? [y]/n");
            string str_dialog = Console.ReadLine();

            if (str_title.Equals("")) { str_title = "empty"; }
            if (str_message.Equals("")) { str_message = "empty"; }
            if (str_URL.Equals("")) { str_URL = "http://www.google.com/"; }
            bool b_dialog = true;
            if (str_dialog.Equals("n") || str_dialog.Equals("no") || str_dialog.Equals("N") || str_dialog.Equals("No") || str_dialog.Equals("NO")) { b_dialog = false; }

            const string client_key = "＜入れる＞";

            //通信とAPI利用回数消費がもったいないのでコメントアウト
            //string str_signature = CreateToken(getNiftyCloudAPIHeader(), client_key);
            //Console.WriteLine(str_signature);
            string str_stored_signature = "＜上記で取得した文字列を入れる＞";
            //Console.WriteLine(str_stored_signature);

            PushNotification(str_stored_signature, str_title, str_message, str_URL, b_dialog);

            Console.WriteLine("Hit any key to end...");
            Console.ReadLine();
        }

        static string getNiftyCloudAPIHeader()
        {
            // http://mb.cloud.nifty.com/doc/current/rest/common/signature.html
            // niftyクラウドでREST APIを使う際は、署名が必要
            // 署名データを得るための文字列を返す
            // JSONデータは不要なので、timeまで
            // timeは現在時刻とあったが、とりあえず固定値にしてある
            //
            const string str_header1 = "POST\nmb.api.cloud.nifty.com\n/2013-09-01/push\n";
            //DateTime dt = DateTime.Now;
            //string time = dt.ToString("yyyy-MM-ddTHH:mm:sszzzz");
            string time = "2013-12-02T02:44:35.452Z";
            string str_header2 = "SignatureMethod=HmacSHA256&SignatureVersion=2&X-NCMB-Application-Key=＜入れる＞X-NCMB-Timestamp=" + time;
            return str_header1 + str_header2;
        }

        // 与えられたmessegeを秘密鍵secretでハッシュ値を生成してBase64エンコードする
        // http://www.jokecamp.com/blog/examples-of-creating-base64-hashes-using-hmac-sha256-in-different-languages/#csharp
        static string CreateToken(string message, string secret)
        {
            secret = secret ?? "";
            var encoding = new System.Text.ASCIIEncoding();
            byte[] keyByte = encoding.GetBytes(secret);
            byte[] messageBytes = encoding.GetBytes(message);
            using (var hmacsha256 = new HMACSHA256(keyByte))
            {
                byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
                return Convert.ToBase64String(hashmessage);
            }
        }

        static void PushNotification(string signature, string pushTitle, string pushMessage, string pushURL, bool dialog)
        {
            // ----------------------------------------------------------------------
            // http://www.macklabmedia.com/send-push-notification-parse-rest-api-c/
            // RestSharpを利用（nugetでインストールする）
            // try-catch必要かも？
            // ----------------------------------------------------------------------

            // Output "BEGIN" to console
            Console.WriteLine("PushNotification_BEGIN");

            // Build Request URL
            var client = new RestClient("https://mb.api.cloud.nifty.com");
            var request = new RestRequest("2013-09-01/push", Method.POST);

            string mess = "\"" + DateTime.Today.ToShortDateString() + ": " + pushMessage + "\"";

            // Build JSON string to send to server
            string json = "{\"immediateDeliveryFlag\": true, \"target\":[\"android\"], \"message\":\"Please input your test messge\",\"deliveryExpirationTime\":\"3 day\"}";

            // Build JSON string using DynamicJson
            // http://neue.cc/2010/04/30_256.html
            // DynamicJson.csをプロジェクトに追加
            var obj = new
            {
                immediateDeliveryFlag = true,
                target = new[] {"android"},
                message = mess,
                deliveryExpirationTime = "3 day",
                title = pushTitle,
                dialog = dialog,
                action = "com.example.hogehoge.RECEIVE_PUSH",  // カスタムレシーバー（適宜変更する）
                richUrl = pushURL
            };
            var formattedString = DynamicJson.Serialize(obj);
            Console.WriteLine(formattedString);
                
            // Output json to console
            //Console.WriteLine(json);
            //Console.WriteLine(formattedString);
            json = (string)formattedString;

            // Build Parameters and Headers to send with request
            request.AddParameter("application/json", json, ParameterType.RequestBody);

            // Enter your App ID and REST API Key from your Parse account. Login and go to Settings and Keys.
            request.AddHeader("X-NCMB-Application-Key", "＜入れる＞");
            request.AddHeader("X-NCMB-Signature", signature);
            request.AddHeader("X-NCMB-Timestamp", "2013-12-02T02:44:35.452Z");

            // Let the Parse server know you're sending JSON
            request.AddHeader("Content-Type", "application/json");

            // Execute the Request
            IRestResponse response = client.Execute(request);

            // Get the response back from server
            var content = response.Content;
            Console.WriteLine("response = " + content);

            // Output "END" to console
            Console.WriteLine("PushNotification_END");
        }
    }
}
```