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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

ASP.NET

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

ASP.NET Web API

ASP.NET Web APIはブラウザやモバイル機器のようなクライアント向けのHTTPサービスを構築するフレームワークです。Microsoft .NET Frameworkがベースになっており、RESTfulサービスを構築するには理想的です。

Q&A

解決済

1回答

4387閲覧

jsonデータをASP.net web apiで取得したい

america

総合スコア35

C#

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

ASP.NET

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

ASP.NET Web API

ASP.NET Web APIはブラウザやモバイル機器のようなクライアント向けのHTTPサービスを構築するフレームワークです。Microsoft .NET Frameworkがベースになっており、RESTfulサービスを構築するには理想的です。

0グッド

1クリップ

投稿2021/12/01 03:40

編集2021/12/02 01:58

C# asp.net core でMVC内でweb apiを作成し
そのURLに対してjs のfetch でbodyにjsonを指定して
投げた際にjsonのデータが取得できません

MVC内でweb apiをの方はvisual studioのデバッグでローカルサーバーをたて
ブレークポイントを設定すると止まるので通信は
できていると思うのですが、Request.Body;の中身を見ても
飛ばしたjsonの値がなく困っています。

C#

1 public class Test 2 { 3 readonly ITestList _testList; 4 public Test(ITestList testList) 5 { 6 _testList = testList; 7 } 8 9 public ServiceResult<TestList> GetList() 10 { 11 ///ここでJsonデータを受け取りたい 12 return _testList.getList(); 13 } 14 } 15

javascript

1 const json = { 2 test:"test", 3 testnumber:"10" 4 } 5 6 formData.append("files", e.target.files[0]) 7 8 const response = fetch("対象URL", 9 { 10 method:"post", 11 headers:{ 12 'Content-Type': 'application/json' 13 }, 14 body:JSON.stringify(json) 15 })

追記
OS: Windows10
asp.net core 5
Visual Studio 2019

C#

1 public class Test 2 { 3 readonly ITestList _testList; 4 public Test(ITestList testList) 5 { 6 _testList = testList; 7 } 8      //[FormBody]用に追加 9 public class Parameter 10 { 11 public string title { get; set; } 12 public string name { get; set; } 13 } 14 //引数に[FromBody]を追加 15 public ServiceResult<TestList> GetList([FromBody] Parameter test) 16 { 17 ///ここでJsonデータを受け取りたい 18 return _testList.getList(); 19 } 20 }

javascript

1   //jsonに名前をMVCのparameterが受け取れるように変更 2 const json = { 3 title:"test", 4 name:"10" 5 } 6 7 formData.append("files", e.target.files[0]) 8 9 const response = fetch("対象URL", 10 { 11 method:"post", 12 headers:{ 13 'Content-Type': 'application/json' 14 }, 15 body:JSON.stringify(json) 16 })

ご指摘があったのでMVCの方の引数に[FormBody]を追加したところ、デバッグでブレークポイントに止まらなくなりました。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/12/01 03:55 編集

OS は何か、Core のバージョン、Viusal Studio のバージョンを質問欄を編集して追記してください。ASP.NET のタグもつけていただけると幸いです(Web API のタグの方は見てないので)。
退会済みユーザー

退会済みユーザー

2021/12/02 01:44

話が通じてますか? 回答しましたが読んでもらってますか? 私の回答の中に必要な情報は含まれていると思います。読んだが分からなかったということなら回答欄のコメントで質問してください。
america

2021/12/02 02:02

ご返信ありがとうございます。 OSなどに関して追記いたしましたので確認いただけると幸いです。 >Web API ではなくて MVC のアクションメソッドですよね?  に関してですが、MVC内でアクションメソッドとは別にapiで値を取得する部分を作成しており、 return View()の部分は変更をわすれて投稿をしていました。修正をしたので確認いただけると ありがたいです。 >アクションメソッドの引数にモデルバインディングされるので、それから取得します。 に関してですが、書かれてる通りにMVCに[FromBody]に引数を追加したところ、デバッグ時にブレークポイントに 止まらなくなりました。
退会済みユーザー

退会済みユーザー

2021/12/02 02:04

回答欄のコメントで質問してくださいと書いたはずですが無視ですか?
退会済みユーザー

退会済みユーザー

2021/12/02 03:05

質問者さんが別に立てたスレッド https://teratail.com/questions/371821 は、上の質問欄に追記した、 > MVCの方の引数に[FormBody]を追加したところ、デバッグでブレークポイントに止まらなくなりました。 ・・・ということで、それを解決したいということですよね。であれば、その解決はこのスレッド行って、別に立てたスレッドは運営に削除依頼を出してください。スレッドの乱立は Teratail 参加者の皆さんに迷惑です。
退会済みユーザー

退会済みユーザー

2021/12/03 07:29

質問者さん、その後無言ですが、下の回答のコメントで私が書いた Web API 用のコントローラーの作り方をみて作ってみましたか? とにかくまずそれをやってもらわないと話が進まないのですが・・・
退会済みユーザー

退会済みユーザー

2021/12/08 00:21

いつまでも放置しておかないでクローズしてください。
guest

回答1

0

ベストアンサー

OS, Core のバージョン等が不明ですが、Windows OS で Core v3.1 よりは新しいだろうと想像して・・・

やってることがいろいろ見当違いに見えますけど?

まず、

C# asp.net core でweb apiを作成し

とのことですけど、コードを見ると View() を返しているし、Web API ではなくて MVC のアクションメソッドですよね? 

送信されてきた JSON データを取得する目的だけなら Web API のアクションメソッドでも MVC のアクションメソッドでもどっちでも可能ですが、微妙に違うのでどっちを作っているか間違いなく書いてください。

Request.Body;の中身を見ても飛ばしたjsonの値がなく困っています。

Web API も MVC も Request.Body は使いません。アクションメソッドの引数にモデルバインディングされるので、それから取得します。

ちなみに、そもそも Request.Body からは読めません。読むには以下のようなことをしないとダメです。Request.Body を使うことはないのでどうでもいい話ですが、興味があれば読んでください。

HttpRequest.Body から読み取る方法 (CORE)
http://surferonwww.info/BlogEngine/post/2021/04/15/how-to-read-posted-body-from-httprequest-body.aspx

また、アクションメソッドの引数にモデルバインディングすると書きましたが、ASP.NET Core MVC のアクションメソッドに JSON 文字列をボディに含めて POST 送信する場合、アクションメソッドの引数に [FromBody] 属性を付与しないとモデルバインディングに失敗します。

詳しくは以下の記事を見てください。

MVC に JSON をバインドするには [FromBody] が必要 (CORE)
http://surferonwww.info/BlogEngine/post/2021/04/12/frombodyattribute-is-required-for-model-binding-json-to-action-method-of-mvc.aspx

投稿2021/12/01 04:49

編集2021/12/01 09:12
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

america

2021/12/02 02:17

ご返信ありがとうございます。 また回答欄での回答に関して見落としておりすいませんでした。 OSなどに関して追記いたしましたので確認いただけると幸いです。 >Web API ではなくて MVC のアクションメソッドですよね?  に関してですが、MVC内でアクションメソッドとは別にapiで値を取得する部分を作成しており、 return View()の部分は変更をわすれて投稿をしていました。修正をしたので確認いただけると ありがたいです。 >アクションメソッドの引数にモデルバインディングされるので、それから取得します。 に関してですが、書かれてる通りにMVCに[FromBody]に引数を追加したところ、デバッグ時にブレークポイントに 止まらなくなりました。
退会済みユーザー

退会済みユーザー

2021/12/02 02:46 編集

> MVC内でアクションメソッドとは別にapiで値を取得する部分を作成しており、 どうやって作ったのか分かりませんが、質問欄に追記されたものは Web API 用のコントローラーではありません。自己流で訳が分からないまま適当にやらないで、本を買って読んで作り方を勉強してください。でないと話が通じません。 簡単に作り方を書いておくと、ソリューションエクスプローラーで Controllers フォルダを右クリックすると表示されるメニューで[追加(D)]⇒[コントローラー(T)...]に進んで表示されるダイアログの左側に表示されている「インストール済み」の中から[API]を選択し、右側に表示されるアイテムから[API コントトーラー -空]を選んで作ってみてください。 > 書かれてる通りにMVCに[FromBody]に引数を追加したところ、 回答読んでますか? それが必要なのは MVC 用のコントローラーのアクションメソッドで、Web API の場合は必要ありません。 > デバッグ時にブレークポイントに止まらなくなりました。 それは [FromBody] を追加したからではなく、何か変なことをしたからでしょう。
america

2021/12/08 05:41

返信が遅れて申し訳ありません。 ご指摘の通りweb apiを作ったみたらjsonデータがとることができました。 見比べたところ 最終的にはstartupにservices.AddControllers();を追加することで解決することができました。
退会済みユーザー

退会済みユーザー

2021/12/08 06:37 編集

> 最終的にはstartupにservices.AddControllers();を追加することで解決することができました。 何かまた自己流でやってませんか? Visual Studio 2019 を使った .NET 5.0 の ASP.NET Core アプリですよね。プロジェクトを作成するのにテンプレートは使ってないのですか? Visual Studio 2019 のテンプレートを使って Web API アプリを作ったのであれば services.AddControllers(); は最初から Startup.cs に含まれています。 Visual Studio 2019 のテンプレートを使って MVC アプリを作ったのであれば services.AddControllersWithViews(); が最初から Startup.cs 含まれていて、Web API もそれで OK です。 上の質問者さんのコメントに、 > MVC内でアクションメソッドとは別にapiで値を取得する部分を作成 と書いてありましたので、後者の「Visual Studio 2019 のテンプレートを使って MVC アプリを作った」のだと思っていたのですが、違うのですか? 前にもアドバイスしましたが、自己流で訳が分からないまま適当にやらないで、本を買って読んで作り方を勉強しましょう。そうしていれば今回のような質問はしなくて済んだはずです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問