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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

Q&A

解決済

2回答

2618閲覧

AzureFunctionAppでPOSTに失敗します

hotategai

総合スコア9

C#

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

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

0グッド

0クリップ

投稿2017/04/12 08:30

###前提・実現したいこと
AzureFunctionAppで、下記のようなリクエストを投げる関数を作ろうとしていますが、結果がエラーとなります。
なお、下記のリクエストは正常なレスポンス({"success":true})を得られています。

curl https://xxxxx -H 'X-Api-Key: yyyyy' -H 'Content-Type: application/json' -X POST -d '[{"name": "Sample.foo", "time": '1491806100', "value": 60}]'

エラー解消の手がかりをご教授いただけませんでしょうか。

###発生している問題・エラーメッセージ
Httpリクエストの返却値は以下の通りです。

HTTP Status: BadRequest – Reason: Bad Request

送信データのRequestMessageは以下の通りです。

RequestMessage:Method: POST, RequestUri: 'https://xxxxx', Version: 1.1, Content: System.Net.Http.StringContent, Headers: { X-Api-Key: xxxxx Content-Type: application/json; charset=utf-8 Content-Length: 54 }

###該当のソースコード

cs

1 2 // POST 先 3 Uri theUri = new Uri("https://xxxxx"); 4 5 //HttpClient を作成しヘッダーを設定 6 HttpClient aClient = new HttpClient(); 7 aClient.DefaultRequestHeaders.Add("X-Api-Key", "yyyyy"); 8 9 // JSON としてシリアライズし POST するデータ 10 JsonItems jsonItems = new JsonItems(); 11 12 //値をセット 13 jsonItems.name = "Sample.foo"; 14 jsonItems.time = "1491806100"; 15 jsonItems.value = "60"; 16 17 // 該当タイプ用の JsonSerializer を作成 18 DataContractJsonSerializer jsonSer = new 19 DataContractJsonSerializer(typeof(JsonItems)); 20 21 // Serializer を使ってオブジェクトを MemoryStream に書き込み 22 MemoryStream ms = new MemoryStream(); 23 jsonSer.WriteObject(ms, jsonItems); 24 ms.Position = 0; 25 26 // StreamReader で StringContent (Json) をコンストラクト 27 StreamReader sr = new StreamReader(ms); 28 StringContent theContent = new StringContent(sr.ReadToEnd(), System.Text.Encoding.UTF8, "application/json"); 29 30 // データを送信 31 HttpResponseMessage aResponse = await aClient.PostAsync(theUri, theContent); 32 33 if (aResponse.IsSuccessStatusCode) 34 { 35 log.Info("成功!"); 36 } 37 else 38 { 39 log.Info("失敗!"); 40 // 応答ステータスコードを表示 41 String failureMsg = "HTTP Status: " + aResponse.StatusCode.ToString() + " – Reason: " + aResponse.ReasonPhrase; 42 43 log.Info("RequestMessage:" + aResponse.RequestMessage.ToString()); 44 log.Info("failureMsg:" + failureMsg.ToString()); 45 } 46

###試したこと

  • HttpClientのヘッダ情報を下記の通り増やしましたがレスポンスは同じでした。

cs

1 aClient.DefaultRequestHeaders.Host = theUri.Host; 2 aClient.DefaultRequestHeaders.Add("Content-Type", "application/json;charset=UTF-8"); 3 aClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 4
  • contentを下記の通りにしましたがレスポンスは同じでした。

cs

1 var content = new FormUrlEncodedContent(new Dictionary<string, string> 2 { 3 { "name", "Sample.azure" }, 4 { "time", "1491877200" },//TODO ★★$(date +%s) 5 { "value", "60" }, 6 });

###補足情報(言語/FW/ツール等のバージョンなど)
言語:C#

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

Jsonの形式あってますか。
JsonItemsクラスは配列でシリアライズされるようになってるんですかね。

投稿2017/04/12 15:02

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hotategai

2017/04/14 02:20

回答ありがとうございます。 おっしゃる通り、Jsonの形式に誤りがありました。 本来配列の中に入れなければいけないところ、私のソースでは直接値が入っていたようです。 List形式で渡すようにしたところ、解消しました。 ありがとうございました。
guest

0

Azure Functions に固有の問題には見えないので、同等の動作をする Concole アプリケーションを作って、Fiddler 等のツールで実際にどんなリクエストを投げられているのか観察してみてはどうでしょうか。

投稿2017/04/12 09:59

編集2017/04/12 10:03
hidori

総合スコア402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hotategai

2017/04/14 02:20

回答ありがとうございます。 Concole アプリケーションを作る前にいったんAzure上でログを出力してみたところ、Jsonの形式に誤りがありました。 本来配列の中に入れなければいけないところ、私のソースでは直接値が入っていたようです。 List形式で渡すようにしたところ、解消しました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問