質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • C#

    7132questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • API

    1526questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • Server

    112questions

C#のHttpClientでNiftyCloudのAPIを利用した際における500Error

受付中

回答 0

投稿

flag 質問者が4日前に「まだ回答を求めています」と言っています。

  • 評価
  • クリップ 1
  • VIEW 61

MIKASANN

score 22

C#を勉強しておりこの度NiftyCloudのAPIの利用を試みました。
自分なりに挑戦しましたがうまくいきません。
有識者の方いましたら間違いをご教示ください。

API利用の流れですがniftycloudのapiはGETリクエストでURLにエンコードしたパラメーターを付与して利用します。
また各APIを利用するために、利用するAPI特有のパラメーター以外に共通パラメーター(CommonParam)を付与する必要があります。
この共通パラメーターの部分で2つ不明な点がありましたのでサンプルをコピペしました。
そこが間違えている可能性がありますが詳しくはソースコードのコメントに記載しております。

[エンドポイント]
https://cloud.nifty.com/api/endpoint.htm
[共通パラメーター]
https://cloud.nifty.com/api/rest/authenticate.htm
[API]
https://cloud.nifty.com/api/rest/RunInstances.htm

下記ソースコードではRunInstances APIでサーバーの作成を試みたものです。
ソースコードにコメントを記載しておりますのでご覧いただければと思います。

        static  void Main(string[] args)
        {

            ///////////////////////////////////シグネチャー(共通パラメーターの内の1つ)を生成/////////////////////////////////////////////

            //シグネチャー作成やAPIを利用する際に必要なパラメーターの定義
            string AccesKeyId = "Himitu";
            string Action = "RunInstances";
            string SignatureMethod = "HmacSHA256";
            string SignatureVersion = "2";
            //タイムスタンプの作成
            var localtime = DateTime.Now;
            var timestamp = localtime.ToString("yyyy-MM-ddTHH:mm:ssZ");

            //シグネチャー作成のためにパラメーターをエンコード
            var content = new FormUrlEncodedContent(new Dictionary<string, string>

            {

                {"AccessKeyId",AccesKeyId},

                {"Action",Action},

                {"SignatureMethod",SignatureMethod },

                {"SignatureVersion",SignatureVersion},

                {"Timestamp",timestamp}

            });

            //シグネチャー作成やAPIを利用する際に必要なパラメーターの定義

            string HTTP_request_method = "GET";
            string endpoint_domain = "jp-east-1.computing.api.nifcloud.com";

            //[不明点1]URLエンコードしたendpointのパス部分の意味が分からないのでサンプルのコピペ
            string urlencoded_endpoint = "/api/services/NiftyCloud/";

            //[不明点2]サンプルではendpoint_domainの後に\\nとあったがのでそのままサンプルのコピペ
            string StringToSign = HTTP_request_method + "\n" + endpoint_domain + "\\n" + urlencoded_endpoint + "\n"+content.ReadAsStringAsync().Result;

            string SecretKeyId = "Himitu";

            //HMACSHA256とStringToSign,SecretKeyIdを利用してシグネチャーを生成
            var Signature = "";

            ASCIIEncoding encoding = new ASCIIEncoding();
            Byte[] StringToSignByte = encoding.GetBytes(StringToSign);
            Byte[] AccesKeyIDByte = encoding.GetBytes(SecretKeyId);

            Byte[] hashBytes;
            using (HMACSHA256 hash = new HMACSHA256(AccesKeyIDByte))
            {
                hashBytes = hash.ComputeHash(StringToSignByte);
                Signature = BitConverter.ToString(hashBytes).Replace("-", "").ToLower();
            }

            ///////////////////////////////////////////////////////////ここまでがシグネチャーの作成//////////////////////////////////////////////

            //RunInstances API利用するために必要なパラメーター
            string ImageId = "1";
            string KeyName = "nifcloud";
            string InstanceType = "e-mini";
            string InstanceId = "server01";
            string servername = "serve01";
            string servertype = "e-mini";
            string AccountingType = "2";

            var parameters = new FormUrlEncodedContent(new Dictionary<string, string>
            {
                {"Action",Action },
                {"ImageId",ImageId},
                {"KeyName",KeyName},
                {"InstanceType",InstanceType},
                {"InstanceId",InstanceId},
                //以下のパラメーターはCommonParames部分
                {"AccessKeyId",AccesKeyId},
                {"SignatureVersion",SignatureVersion},
                {"Signature",Signature},
                {"Timestamp",timestamp},
                {"SignatureMethod","HmacSHA256"}
            });



            string endpoint = "https://jp-east-1.computing.api.nifcloud.com/api/";
            getAPI(endpoint, parameters);
            Console.ReadKey();
        }

        //HTTPClientを利用してGETリクエストを送る関数
        static async void getAPI(string url, FormUrlEncodedContent param)
        {
            using (var client = new HttpClient())
            {

                var response = await client.GetAsync(url+"?"+param.ReadAsStringAsync().Result);
                Console.WriteLine(response);
                Console.WriteLine(response.StatusCode);
                Console.WriteLine(response.Content);
                Console.WriteLine(response.ToString());
            }

        }


    }

このコードを動かしたところ下記のResponseが帰ってきました。

StatusCode: 500, ReasonPhrase: 'Internal Server Error', Version: 1.1, Content: System.Net.Http.NoWriteNoSeekStreamContent, Headers:
{
  Connection: close
  Date: Sat, 13 Oct 2018 15:16:10 GMT
  Server: Apache
  Content-Length: 298
  Content-Type: application/xml
  Content-Encoding: UTF-8
}
InternalServerError
System.Net.Http.NoWriteNoSeekStreamContent
StatusCode: 500, ReasonPhrase: 'Internal Server Error', Version: 1.1, Content: System.Net.Http.NoWriteNoSeekStreamContent, Headers:
{
  Connection: close
  Date: Sat, 13 Oct 2018 15:16:10 GMT
  Server: Apache
  Content-Length: 298
  Content-Type: application/xml
  Content-Encoding: UTF-8
}

APIを利用するにあたって利用したサイトも貼っておきます。

[今更ですがHttpClientを使う]
https://qiita.com/rawr/items/f78a3830d894042f891b#%E3%82%AF%E3%82%A8%E3%83%AA%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E9%80%81%E3%82%8B
[NIFTY CloudのREST APIを使うために必要な知識]
http://naoberry.com/tech/rest-api/
[NIFTY Cloud APIをRubyから使ってみる!]
http://blogs.itmedia.co.jp/niftycloud/2011/08/nifty-cloud-api-0052.html
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • hihijiji

    2018/10/19 18:44

    NiftyCloudではVisual Studio のサービス参照の追加の機能は使えないのでしょうか?

    キャンセル

  • MIKASANN

    2018/10/20 14:35

    NuGetパッケージのことですか?他サーバーにあるようなSDKはありませんでした><

    キャンセル

  • hihijiji

    2018/10/20 15:21

    [サービス参照の追加]はVisual Studioの基本機能です。使い方はググって下さい。クライアントを自動作成してくれます。よくあるパターンとしてはstringで設定しているパラメータの書式違いなので、自動生成クライアントを使うことで解決するかもしれません。

    キャンセル

  • MIKASANN

    2018/10/20 22:15

    そんな便利な機能あったのですね...さっそくググってみます。ありがとうございました。

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    7132questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • API

    1526questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • Server

    112questions