当前位置: 首页 > 知识库问答 >
问题:

加载资源失败:服务器响应状态为400()。错误:Angular asp。net core 5 api

慕飞章
2023-03-14

我正在开发一个前端使用Angular 12和API中使用ASP. net core 5的应用程序。调用HttpPost API时,我收到错误加载资源失败:服务器响应状态为400()

如果我使用字符串或整数参数,则没有问题并且API被正确调用。但只有当我使用实体类传递值时,我才会收到此错误。

这是我的实体类在asp.net核心

public class FrontEnd
{ 
  public class SendOTPReq
    {
        public string MobileNo { get; set; }
        public string Email { get; set; }
        public int Type { get; set; }
    }
}

这是API

    [Route("SendOTP")]
    [HttpPost]
    public async Task<object> SendOTP(SendOTPReq otpReq)
    {
        try
        {
            CommonApiResponse commonResponse = new CommonApiResponse();

            if (!ModelState.IsValid)
            {
                return new APIResponse(406, "", ModelState.Select(t => new { t.Key, t.Value.Errors[0].ErrorMessage }));
            }
            var Result = await _IFrontEndRepository.SendOTP(otpReq);
            if (Result != null)
            {
                commonResponse.Status = "Success";
                commonResponse.ErrorMsg = "";
                commonResponse.ResultData = Result;
                return new APIResponse(200, "Request Success", commonResponse);
            }
            else
            {
                commonResponse.Status = "Failed";
                commonResponse.ErrorMsg = Result.Message;
                commonResponse.ResultData = Result;
                return new APIResponse(204, "Request Failed", commonResponse);
            }
        }
        catch (Exception e)
        {

            throw new Exception(e.Message);
        }

    }

这是我的角度分量。ts代码:

const otpReq = new SendOTPReq();

otpReq.MobileNo = this.registerForm.controls['phoneNo'].value;
otpReq.Email = this.registerForm.controls['email'].value;
otpReq.Type = 2; //2 is or email and 1 is for sms

this.accountsService.sendOTP(otpReq).subscribe(      
  (data) => {
         //do stuff here
    
         });

角度服务方式:

export class AccountsService {

constructor(private httpClient: HttpClient,
private _router: Router) { }

 sendOTP(otpReq: SendOTPReq): Observable<SendOTPReq> {
  debugger;
  return this.httpClient.post<SendOTPReq>(environment.ApiUrl + 'FrontEnd/SendOTP', otpReq)
    .pipe(
      catchError(this.errorHandler),
    );
}


errorHandler(error: { error: { message: string; }; status: undefined; message: any; }) {
  debugger;
  let errorMessage = '';
  if (error.error instanceof ErrorEvent) {
    // Get client-side error
    errorMessage = error.error.message;
  } else {
    // Get server-side error
    if(error.status == undefined)
    {
      errorMessage = "The server connection with the application is showing error. Close the application and restart again."
    }else{
    errorMessage = `Error Code: ${error.status}\nMessage: ${error.message}`;
    }
  }      
  return throwError(errorMessage);
}

}

角度模型类:

export class SendOTPReq
{
  MobileNo!:string;
  Email!: string;
  Type!: number;
}

出了什么问题?

共有3个答案

沃威
2023-03-14

尝试在API中添加[FromBody]装饰器,如下所示:

public async Task<object> SendOTP([FromBody]SendOTPReq otpReq)

更新:根据对这个和其他答案的评论,似乎设置了一些错误处理,并且在您的POST请求中更详细一点,这可能会进一步揭示问题的原因。假设您有我在API中描述的装饰器,让我们进一步增强API,重点是返回类型,以及使用RxJs在Angular中的服务函数,看看我们是否可以从中提取出更有用的响应。

为了清晰起见,总而言之,取消SendOtpReq类的嵌套:

public class SendOTPReq
{
    public string MobileNo { get; set; }
    public string Email { get; set; }
    public int Type { get; set; }
}

接下来,我们将控制器POST方法的返回类型调整为IActionResult:

[Route("SendOTP")]
[HttpPost]
public async Task<IActionResult> SendOTP([FromBody]SendOTPReq otpReq)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    try
    {                
        var Result = await _IFrontEndRepository.SendOTP(otpReq);
        if (Result != null)
        {
            return Ok(Result);                       
        }

        return BadRequest($"Fail to POST");    
     }
     catch (Exception ex)
     {    
         return BadRequest($"Fail to POST");
     }

 }

现在,让我们使用角度服务观察API的整个响应,而不仅仅是主体:

public sendOTP(otpReq: SendOTPReq): Observable<HttpResponse<SendOTPReq>> {
  return this.httpClient.post<SendOTPReq>(environment.ApiUrl +
             'FrontEnd/SendOTP', otpReq { observe: "response" })
             .pipe(
             catchError(this.errorHandler),
    );
}
谢清野
2023-03-14

所以,最后,我修复了它。一个接一个地注释属性和取消注释。当我从“mobileNo”字段获取数据时,我并没有将其转换为字符串。将手机号码转换为字符串有效。

我换了行:

otpReq.MobileNo = this.registerForm.controls['phoneNo'].value;

otpReq.MobileNo = this.registerForm.controls['phoneNo'].value.toString();
刘绍晖
2023-03-14

您的POST请求的返回类型错误。当角度httpClient要求返回SendOTPReq时,您不能让控制器返回对象。

所以相反你需要

return this.httpClient.post<MyActualReturnType>(environment.ApiUrl + 'FrontEnd/SendOTP', otpReq)
 类似资料:
  • 服务器js公司 应用程序。js公司 注册处理程序代码 当我试图注册一个用户时,我遇到了错误400。加载资源失败:服务器响应状态为400(错误请求),我已附加我的注册表。js文件寄存器。js:26个职位https://warm-earth-96837.herokuapp.com/register400(错误请求)寄存器。onSubmitSignIn@寄存器。js:26 400错误请求错误是一个HTT

  • 我在Amplify中遇到了这个错误,我完成了构建tho。 该系统可以在本地环境中工作。包裹本地env的json脚本是这样的。 我的放大镜。xml如下。 屏幕完全倾斜了。 有没有人有同样的问题?

  • 这是我第一次使用Sanity构建博客网站来练习使用React JS,在那里我应该从sanity.io.调用一个API,但是我的React网站无法从Sanity获取数据。在网页上应该从Sanity博客导入数据的区域实际上是一个空白屏幕。当我检查控制台时,我发现了这个错误: 这是我的网络负载 还有我的网络预览 这是本应显示信息的页面的代码 非常感谢你的帮助。谢谢

  • 这是我第一次编写一个应用程序,其中我将后端链接到fornted(spring-boot-react)。 我已经到了这样的地步,我想从客户端视图中填写一个表单并提交它(在这种情况下,将表单保存到数据库中)。 我启动了服务器(spring boot中的应用程序)和客户端(react)。启动的应用程序已加载。表单会显示出来,但当我填写表单并单击“提交”时,不会执行任何操作。我使用devtools并得到错

  • 我的代码工作正常,但当我试图从后端获取数据时,我收到一个错误“400错误请求”,我不知道发生了什么错误。请解决我的问题。 //API==http://localhost:8000/api/ 指数js公司 在这里,我分享了我的实际代码,其中添加操作被执行到表单中。js公司 $$$$$$$$$$$$$$$ 后端 $$$$$$$$$$$$$$$$$$$$$ 待办事项。js/路由器 待办事项。js/控制器

  • 我正在制作一个博客应用程序。如果我尝试访问单个概要文件,微调器将继续运行,但当我签入react dev工具时,数据就在那里。我哪里出错了?其他一切都很好。配置文件是可见的,但当我进入单个配置文件时,问题就出现了 轮廓js公司 数据来自的源,配置文件。js公司 我的github回购链接

  • 我在数据库中添加了一行上传图像。当我查看行列表时,会出现图像,但当我尝试更新行时,我遇到错误“加载资源失败:服务器响应状态为400:spring mvc”。图像未出现!! 谁能帮帮我!

  • 我试图使用react fetch将json对象发送到spring控制器。但我有以下错误。加载资源失败:服务器响应状态为400(错误请求) 但是get方法可以成功调用。 http://localhost:8080/test/xx/getSprintTasks/${this.props.sprintNo}` 反应提取: 我的身体: 我还尝试了以下操作: 我的控制器: } 任务java: