実現したいこと
asp.netのreactテンプレートを使用して、react側からfetchしてPOST形式でデータを受け渡したい
発生している問題・分からないこと
404エラーになってしまう。(console.logには エラーが発生しました のメッセージがでる)
エラーメッセージ
error
1POST https://localhost:44458/search 404 (Not Found)
該当のソースコード
js
1const sendSearchRequest = async () => { 2 if (keyword.trim() === '') return; // 空の入力は無視 3 try { 4 //const response = await fetch('/api/search', { 5 const response = await fetch('search', { 6 method: 'POST', 7 headers: { 8 'Accept': 'application/json', //追加 9 'Content-Type': 'application/json', 10 }, 11 body: JSON.stringify({ keyword: keyword }) 12 }); 13 14 if (response.ok) { 15 const result = await response.json(); 16 console.log('結果:', result); 17 } else { 18 console.error('エラーが発生しました'); 19 } 20 } catch (error) { 21 console.error('通信エラー:', error); 22 } 23 console.log(keyword) 24 };
C#
1 [Route("[controller]")] 2 [ApiController] 3 public class SearchController : ControllerBase 4 { 5 [HttpPost] 6 public IActionResult Post([FromBody] SearchRequest request) 7 { 8 string keyword = request.Keyword; 9 10 // キーワードを使って検索処理などを行う 11 var result = $"検索キーワードは: {keyword} です"; 12 13 return Ok(new { message = result }); 14 } 15 } 16 public class SearchRequest 17 { 18 public string Keyword { get; set; } 19 }
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
ネットで同様の例が見つかりませんでした。
テンプレートのデフォルトでweatherforecastをgetでとってきているのでCORS(クロスオリジン)問題ではなさそう。
補足
reactテンプレート
react18.2
.net6
reactとASP.NET Coreはそれぞれ何番ポートで動作していますか?
エラーメッセージにある「44458」ポートはreact側のポートではないでしょうか?
コメントありがとうございます。
ASP.NET Core サーバーではhttps://localhost:7050
でhttps://localhost:44458 にリダイレクトされているようでした(おそらくこちら側がreactのサーバー)
ただ、デフォルトで用意されていたFetchData.jsとWeatherForecastController.csはGETをつかって天気情報をfetchできているようでしたが、やはりこのポートの違いが問題なのでしょうか?
なるほど、ということは ASP.NET APIではなくreactに対しfetchしています。
なのでfetch()の引数でターゲットホストを ASP.NET(https://localhost:7050) となるように指定する必要があります。
サンプルのweatherforecastがホスト指定していないのが不思議に思えるかもしれません。
それはVisualStudioのテンプレートで、react側のプロジェクト内に細工がしてあるからです。
vite.config.jsに「react側の/weatherforecast」にアクセスが来たらASP.NETにリダイレクトするような設定があると思います。作成された "search" に対しても同じことをしてもよいかもしれません。
コメントありがとうございます。以下を試したところ問題が解決しました。
setupProxy.jsに追記したところうまく動きました。
const context = [
"/weatherforecast",
"/作成したコントローラー名",
];
解決していただきありがとうございました。
NET8で確認したので若干違ったかもしれません・・。
解決したようでよかったです。
回答1件
あなたの回答
tips
プレビュー