ASP.NET Core 6+Angular13密码更新接口报415不支持媒体类型错误
解决ASP.NET Core 6 Web API + Angular 13密码更新接口415错误
错误根源
你的API接口通过[FromBody]期望接收JSON格式的请求体,但Angular前端用FormData发送的是multipart/form-data格式,两者媒体类型不匹配,导致415 Unsupported Media Type错误。此外还存在两处关键问题:
- 字段不匹配:API的
ChangePassword模型需要Email、CurrentPassword、NewPassword、ConfirmNewPassword字段,但Angular只传了oldPassword和newPassword - API逻辑错误:
result.Succeeded为true时错误返回500状态码,与实际成功结果矛盾
方案一:Angular改为发送JSON(推荐)
REST API通常以JSON为默认交互格式,此方案更符合规范:
1. 修改Angular Service代码
替换FormData为JSON对象,补充API所需的完整字段(注意字段名与API模型严格匹配):
UpdatePassword(email: string, oldPassword:string, newPassword:string, confirmNewPassword:string): Observable<any>{ const body = { Email: email, CurrentPassword: oldPassword, NewPassword: newPassword, ConfirmNewPassword: confirmNewPassword }; return this.http.put<any>(`${this.baseUrl}/Change-password`, body) .pipe(catchError(this.errorHandler)); }
2. 修改Angular组件TS代码
传递完整参数(用户邮箱可从登录态中获取,比如localStorage或AuthService):
updatePassword(form: any) { const oldPassword = form.value.oldPassword; const newPassword = form.value.newPassword; const reNewPassword = form.value.reNewPassword; // 示例:从本地存储读取当前用户邮箱 const userEmail = localStorage.getItem('userEmail') || ''; if (newPassword !== reNewPassword) { this.has_error = true; this.password_update_msg = '新密码和确认密码必须一致'; return; } this.userService.UpdatePassword(userEmail, oldPassword, newPassword, reNewPassword) .subscribe(() => { this.has_error = false; this.password_update_msg = '密码更新成功,请重新登录!'; form.reset(); }, () => { this.has_error = true; this.password_update_msg = '密码更新失败!'; }); }
方案二:API改为接收FormData
若坚持使用FormData发送请求,需调整API的接收方式:
1. 修改API控制器代码
将[FromBody]改为[FromForm],同时修正状态码逻辑:
[HttpPut] [Route("Change-password")] public async Task<IActionResult> ChangePassword([FromForm] ChangePassword model) { var user = await userManager.FindByEmailAsync(model.Email); if (user == null) { return StatusCode(StatusCodes.Status404NotFound, new Response { Status = "Error", Message = "用户不存在" }); } if (string.Compare(model.NewPassword, model.ConfirmNewPassword) != 0) { return StatusCode(StatusCodes.Status400BadRequest, new Response { Status = "Error", Message = "新密码和确认密码不匹配" }); } var result = await userManager.ChangePasswordAsync(user, model.CurrentPassword, model.NewPassword); if (result.Succeeded) { // 修正:成功返回200状态码 return Ok(new Response { Status = "Success", Message = "密码修改成功" }); } else { var errors = string.Join(", ", result.Errors.Select(e => e.Description)); return StatusCode(StatusCodes.Status400BadRequest, new Response { Status = "Error", Message = $"修改失败:{errors}" }); } }
2. 修改Angular Service的FormData键名
确保键名与API模型字段完全一致:
UpdatePassword(email: string, oldPassword:string, newPassword:string, confirmNewPassword:string): Observable<any>{ const body= new FormData(); body.append('Email', email); body.append('CurrentPassword', oldPassword); body.append('NewPassword', newPassword); body.append('ConfirmNewPassword', confirmNewPassword); return this.http.put<any>(`${this.baseUrl}/Change-password`, body ) .pipe(catchError(this.errorHandler)); }
内容的提问来源于stack exchange,提问作者salah kimi
相关产品推荐
相关产品推荐

