😶‍🌫️

JS→C#のリクエストで400エラーが出る

2024/06/14に公開

環境

  • ASP.NET Core
  • React
  • TypeScript
  • Vite

現象

post時、400 (Bad Request)エラーが出続ける

原因

JS側のデータ型(Number)とC#側のデータ型の不一致

Memo.cs
public class Memo
{
    public int Id { get; set; }
    public string Description { get; set; } = string.Empty;
}
MemosController.cs
[HttpPost]
public async Task<ActionResult<Memo>> PostMemo(Memo memo)
{
    _context.Memo.Add(memo);
    await _context.SaveChangesAsync();

    return CreatedAtAction(nameof(GetMemo), new { id = memo.Id }, memo);
}
MemoInput.ts
const handleSubmit = async () => {
    const newId = new Date().getTime();

    const memo: MemoDataType = {
        id: newId,
        description: description,
    };

    const response = await fetch('api/Memos', {
        method: 'POST',
        headers: {
        Accept: 'application/json',
        'Content-Type': 'application/json',
        },
        body: JSON.stringify(memo),
    });
}

jsで一意の値を付けたかったためgetTimeを使用した(安直)。
しかしgetTimeで生成される桁数がC#のint型で表現できる範囲(-2,147,483,648 ~ 2,147,483,647)を超えていたためエラーが発生。

解決策

C#をより大きい数値型にするかjs側のidを小さい整数値にする。
idをlongにするのがなんか嫌だったのと、テスト用コードだったのでランダム数が格納されるように修正した(安直)。

MemoInput.ts
- const newId = new Date().getTime();
+ const newId = Math.floor(Math.random() * 10000);

Discussion