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

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

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

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

2回答

13890閲覧

【C#】JSON形式でPOSTされたデータを受信したい

jinchan

総合スコア4

C#

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2021/04/09 11:58

編集2021/04/09 13:23

実現したいこと

Gmailで受信したメールの本文を GoogleAppsScript でJSON形式に変換して
とあるURLにPOSTして、受信した側で本文を加工してDBに登録する
というシステムを作っています。
GoogleAppsScript のPOSTはレスポンスコード:200を返してきており
受信した側も受信した request はnullではないと返してきているのですが
request の中身が取得できません。

受取る用のJSON形式に対応したクラスを作成し、POSTで受け取るために必要だという
[FromBody]を記述しましたが、ログでrequestの中身を表示したところ
request: xxxxxx.Controllers.ApiController+RequestJson
となっていました。
JSONをPOSTで受信する場合に他に必要なものがあるのでしょうか?

受信した側のログ

[INFO] xxxxxxxxxx.Controllers.ApiController.Receive()[64] POST受け取った [INFO] xxxxxxxxxx.Controllers.ApiController.Receive()[70] requestはnullではないです。 [INFO] xxxxxxxxxx.Controllers.ApiController.Receive()[72] request:xxxxxxxxxx.Controllers.ApiController+RequestJson [INFO] xxxxxxxxxx.Controllers.ApiController.Receive()[73] method: [INFO] xxxxxxxxxx.Controllers.ApiController.Receive()[74] muteHttpExceptions:False [INFO] xxxxxxxxxx.Controllers.ApiController.Receive()[75] contentType: [INFO] xxxxxxxxxx.Controllers.ApiController.Receive()[75] payload:

該当のソースコード

GAS

1function sendHttpPost(){ 2 3 var payload = 4 { 5 'message' : "メール本文" 6 }; 7 8 var options = 9 { 10 'method' : 'post', 11 'muteHttpExceptions': true, 12 'contentType' : 'application/json', 13 'payload' : JSON.stringify(payload) 14 }; 15 16 var response; 17 18 try{ 19 response =UrlFetchApp.fetch('https://xxxx.xxxxxxxxx.co.jp/Api/Receive/', options); 20 console.log("UrlFetchAppの戻り値:"+response.getResponseCode()); 21 } 22 catch(e) 23 { 24 console.log("error:"+e); 25 } 26 27} 28

C#

1// JSON形式に合わせたクラス 2public class RequestJson 3{ 4 public string method { get; set; } 5 public bool muteHttpExceptions { get; set; } 6 public string contentType { get; set; } 7 public string payload { get; set; } 8} 9 10//POSTを受け取るMETHOD 11[HttpPost] 12public void Receive([FromBody]RequestJson requestJson) 13{ 14 try 15 { 16 logger.Info("POST受け取った"); 17 18 if (requestJson == null) 19 { 20 logger.Info("requestJsonがnullです。"); 21 } 22 else { 23 ViewBag.Receive = requestJson; 24 logger.Info("requestJsonはnullではないです。"); 25 logger.Info("requestJson:" + requestJson); 26 logger.Info( "method:" + requestJson.method); 27 logger.Info("muteHttpExceptions:" + requestJson.muteHttpExceptions); 28 logger.Info("contentType:" + requestJson.contentType); 29 logger.Info( "payload:" + requestJson.payload); 30 } 31 32 //JSONが受け取れられれば、ここで加工、DBへの登録を行いたい。 33 34 } 35 catch (Exception ex) 36 { 37 logger.Error(ex, "例外発生:"+ex); 38 } 39 finally 40 { 41 logger.Info("おわり"); 42 } 43 44} 45

試したこと

[FromBody]を外したり、stringとして受け取れないかを試してみましたがうまくいきませんでした。

環境

ASP.NET Core 3.1

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/04/09 12:35

ASP.NET のタグをつけてください。 一部コードがインデントされていません。``` と ``` で囲ってください。
jinchan

2021/04/09 13:01

対応しました。 ご指摘ありがとうございます。
退会済みユーザー

退会済みユーザー

2021/04/09 13:20

Fiddler を使って要求・応答をキャプチャして期待通りになっているか調べることをお勧めします。 全体的な流れが理解できませんが、要するに POST されてきた JSON 文字列を ASP.NET Core MVC (Web API ではなくて)のアクションメソッドで受けることができれば良いのですか? GAS は全く知りませんが POST ということなのに 'method' : 'get' でいいのですか?
jinchan

2021/04/09 13:24

すみません。 'get'は記入ミスです。修正しました。
jinchan

2021/04/09 13:29

> POST されてきた JSON 文字列を ASP.NET Core MVC (Web API ではなくて)のアクションメソッドで受けることができれば良いのですか? はい。それがしたいことです。
退会済みユーザー

退会済みユーザー

2021/04/09 13:33 編集

get を post に直しても結果は同じですか? 送信する JSON 文字列のサンプルを書いてください。
jinchan

2021/04/10 04:51

サンプルかけずにすみません。 帰宅した後だったので対応できませんでした。
退会済みユーザー

退会済みユーザー

2021/04/12 04:10

質問者さん、無言ですが、回答したのでそれに対するフィードバックを書いてください。役に立った/立たなかったぐらいの返事はすぐできるのでは。役に立たなかったなら、どこが期待する答えと違っているかを書いてもらえると、より期待に近い回答が出せるかも。とにかく無言は NG です。
jinchan

2021/04/12 04:40

すみません。週明けから別件の対応をしていまして、まだ確認できていません。 明日には一旦ご報告できると思います。 すみません。
guest

回答2

0

ベストアンサー

要するに POST されてきた JSON 文字列を ASP.NET Core MVC (Web API ではなくて)のアクションメソッドで受けることができれば良いということなので・・・

送信する JSON 文字列のサンプルを書いてくれるようお願いしたのですが、書いてもらえないので以下の JSON 文字列を使って、

{"method":"方法","muteHttpExceptions": true,"contentType":"image/jpeg","payload":"ペイロード"}

ASP.NET Core 3.1 MVC のアクションメソッドに Fiddler の Composer を使って送信してみました。

イメージ説明

MVC の場合、アクションメソッドの引数に質問者さんが行ったように [FromBody] 属性を付与する必要がありますが、それで JSON 文字列がデシリアライズされた結果の RequestJson オブジェクトがモデルバインドされます。

イメージ説明

質問者さんのケースで何故ダメだったかは不明ですが、RequestJson クラスとアクションメソッドの定義は自分が試したものと同じなので、それ以外の部分(要求ヘッダとボディ?)の違いではないかと思います。

うまくいく場合の要求ヘッダ・ボディの内容は以下の通りです(Fiddler の画像)。比べてみてください。

イメージ説明

投稿2021/04/10 03:33

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

jinchan

2021/04/13 00:20

いただいた情報にならって、Fiddlerを実行したところ、POSTした要求ボディが取得できました。 ありがとうございます。 その後、GASから送信するデータの形に合わせて、モデルにJSONと同じ形式のクラスを以下の通り作り(今まで、同じController内に記述していました)、サーバーにアップして、GASを実行してみましたが、うまくいきませんでした。 ``` public class RequestJson { public string method { get; set; } public bool muteHttpExceptions { get; set; } public string contentType { get; set; } public Payload payload { get; set; } } public class Payload { public string message { get; set; } } ``` 以前は表示されていた「POST受け取った」もログに表示されなくなりました。 GASから送るデータの形式と受け取り側のJSON形式は一致されられていると思うんですが、認識が甘いのでしょうか? メールの本文のサンプルは以下の通りです。 ==== ID:XXXXXXXXX 名称:●●●● 開始日:yyyy/MM/dd 人数:X名 ====
退会済みユーザー

退会済みユーザー

2021/04/13 00:48 編集

上の質問に対するコメントでも書きましたが、Fiddler を使って要求・応答をキャプチャして期待通りになっているか調べることをお勧めします。応答が 500 (サーバーエラー) になっていませんか?
jinchan

2021/04/13 08:46

やってみました。502でした。以下のようなエラーが返ってきたので、HTTPS周りを調べています。 [Fiddler] The connection to 'xxxxxxxxx.xxxxxxx.co.jp' failed. <br />System.Security.SecurityException Failed to negotiate HTTPS connection with server.fiddler.network.https&gt; HTTPS handshake to xxxxxxxxx.xxxxxxx.co.jp (for #41) failed. System.Security.Authentication.AuthenticationException SSPI への呼び出しに失敗しました。内部例外を参照してください。 &lt; 要求された関数はサポートされていません Win32 (SChannel) Native Error Code: 0x80090302
退会済みユーザー

退会済みユーザー

2021/04/13 21:37 編集

502 はプロキシに関係するエラーだと言うことですね。Fiddler もプロキシなので、その辺りに何かあるのかもしれません。Fiddler を入れないで応答は調べられますか?
guest

0

以前にFiddlerでJSON形式のものを受け取れた後に以下のように書いたのですが

その後、GASから送信するデータの形に合わせて、モデルにJSONと同じ形式のクラスを以下の通り作り(今まで、同じController内に記述していました)、サーバーにアップして、GASを実行してみましたが、うまくいきませんでした。

//JSON受け取り用のクラス public class RequestJson { public string method { get; set; } public bool muteHttpExceptions { get; set; } public string contentType { get; set; } public Payload payload { get; set; } } public class Payload { public string message { get; set; } }

別の Payloadクラスを作ったのがよくなかったようで、そのまま

//JSON受け取り用のクラス public class RequestJson { public string method { get; set; } public bool muteHttpExceptions { get; set; } public string contentType { get; set; } public string payload { get; set; } }

としたところ、GASから受け取れました。

お手数おかけして申し訳ありませんでした。

投稿2021/04/14 02:28

jinchan

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問