无法从应用控制器调用API创建笔记,返回400错误求助
笔记站点API调用400错误排查
我开发了一个带笔记创建功能的站点,输入笔记后调用API传入NoteViewModel存入数据库,但调用时返回400错误,且未进入API控制器执行。测试用控制器里的相同代码能正常运行,GET请求也没问题,所有路径和命名都确认正确。
相关代码如下:
应用控制器代码
[HttpPost] public async Task<IActionResult> CreateNote(string? NoteText, string? NoteTitle) { //Plug NoteViewModel viewModel = new NoteViewModel() { ClientId = 1, NoteTypeId = 1, NoteText = NoteText, EditDate = DateTime.Now, NoteTitle = NoteTitle }; string data = JsonConvert.SerializeObject(viewModel); StringContent content = new StringContent(data.ToLower(), Encoding.UTF8, "application/json"); HttpResponseMessage response = await _client.PostAsync(baseAddres + "/DailyNotes/CreateNote", content); if (response.IsSuccessStatusCode) { return RedirectToAction("Notes", new { clientId = 1}); } return View(); }
API控制器代码
[HttpPost] public async Task<ActionResult<Note>> CreateNote(NoteViewModel note) { try { if (note == null) return BadRequest("Cant be Null"); await _dailyNotesRepository.CreateNote(note); return Ok(note); } catch(Exception ex) { return BadRequest(ex.Message); } }
仓储层CreateNote方法代码
public async Task<Note> CreateNote(NoteViewModel note) { Note newNote = new Note() { ClientId = note.ClientId, NoteTypeId = note.NoteTypeId, NoteTitle = note.NoteTitle, NoteText = note.NoteText, EditDate = note.EditDate }; var result = await _context.Notes.AddAsync(newNote); await _context.SaveChangesAsync(); return result.Entity; }
(响应断点截图:
)
已尝试多种方法,确认路径与命名无误,但问题仍未解决。
排查方向与解决方案
1. 序列化大小写不匹配
你在序列化后调用了data.ToLower(),会把所有JSON属性名转成小写(比如clientid),但API端的NoteViewModel属性是PascalCase格式(比如ClientId)。ASP.NET Core默认模型绑定对大小写敏感,会导致无法匹配属性,直接返回400错误,不会进入控制器方法。
解决方法:移除data.ToLower(),保留原始序列化的属性名格式:
string data = JsonConvert.SerializeObject(viewModel); StringContent content = new StringContent(data, Encoding.UTF8, "application/json");
2. 可选:配置模型绑定忽略大小写
如果需要兼容小写属性名的JSON,可在API项目的Program.cs中配置JSON序列化选项:
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; });
3. 检查模型必填属性
如果NoteViewModel中有标记[Required]的属性,而传入的JSON里这些属性为空或缺失,模型验证会直接失败返回400。检查模型类的注解,确保所有必填属性都有有效值。
4. 获取详细错误信息
在应用控制器中读取响应内容,查看具体的验证失败原因:
var errorMessage = await response.Content.ReadAsStringAsync(); // 将errorMessage输出到日志或调试窗口
内容的提问来源于stack exchange,提问作者MakkLaud
相关产品推荐
相关产品推荐

