调用 API 时出现 404 错误

Posted

技术标签:

【中文标题】调用 API 时出现 404 错误【英文标题】:404 error when calling API 【发布时间】:2017-03-06 14:04:48 【问题描述】:

我正在使用 microsoft asp.net 身份教程示例应用程序 [此处][1],直到我对我的项目所需的功能感到满意为止。我需要有一个 API,我可以从单独的 MVC Web 应用程序调用它来对本地 sql 服务器进行身份验证/授权,并将登录凭据从 Web 应用程序传递到 api 以获取标头令牌等。然后我需要能够检查令牌是否有任何请求以提取数据或将数据保存回数据库。

我在该示例解决方案中添加了一个 Web 应用程序项目,它只是一个带有按钮的表单和一些 jquery 来捕获被点击的提交按钮:

$(document).ready(function () 

    var register = function() 
        var dataa = 
            Email: "password@host.com",
            Password: "password",
            ConfirmPassword: "password"
        ;

        $.ajax(
            type: 'POST',
            url: '/api/Account/Register',
            contentType: 'application/json; charset=utf-8',
            data: JSON.stringify(dataa)
        );
        return false;
    

    $('#btnRegister').click(register);
);

然后这里是 api 本身的控制器:

[Authorize]
[EnableCors("*","*","*")]
[RoutePrefix("api/Account")]
public class AccountController : ApiController

    [AllowAnonymous]
    [Route("Register")]
    [HttpPost]
    public async Task<IHttpActionResult> Register(RegisterBindingModel model)
    
        if (!ModelState.IsValid)
        
            return BadRequest(ModelState);
        

        var user = new ApplicationUser()  UserName = model.Email, Email = model.Email ;

        IdentityResult result = await UserManager.CreateAsync(user, model.Password);

        if (!result.Succeeded)
        
            return GetErrorResult(result);
        

        return Ok();
    

当我尝试在 api 上调用 Register 函数时,我在浏览器中收到 404 错误 (jquery-1.10.2.js:8720 POST http://localhost:35714/api/Account/Register 404 (Not Found))。如何从前端调用 api 函数,这个调用可以从我的 web 应用控制器进行还是应该在客户端进行?

添加了 Microsoft.aspnet.cors 和 microsoft.aspnet.webapi.cors,将 config.EnableCors() 添加到 webapiconfig.cs 并将 [EnableCors] 添加到从 apicontroller 继承的 accountcontroller。

【问题讨论】:

'api/Account/Register' 替换为 '/api/Account/Register'(在 URL 前添加 / 使其成为绝对值) 我也注意到了这一点,并更新了我的代码以反映我已经尝试过,同样的错误。 您确定您的网址确实是/api/Account/Register 另外,尝试用[System.Web.Http.HttpPost]装饰你的Register方法 添加了 HttpPost 数据注释,现在我得到一个不同的错误:XMLHttpRequest 无法加载 localhost:44305/api/Account/Register。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问 Origin 'localhost:35714'。响应的 HTTP 状态代码为 405。 【参考方案1】:

您需要在 API 方法中添加 HttpPost 属性:

[AllowAnonymous]
[Route("Register")]
[System.Web.Http.HttpPost]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)

    ...

【讨论】:

我已经做到了,还实现了 CORS,但现在我收到错误代码 500【参考方案2】:

试试这个。

$(document).ready(function () 
    var register = function() 
        var dataa = 
            Email: "password@host.com",
            Password: "password",
            ConfirmPassword: "password"
        ;

        $.ajax(
            type: 'POST',
            url: '/api/Account/Register',
            contentType: 'application/json; charset=utf-8',
            data: model: JSON.stringify(dataa)
        );
        return false;
    

    $('#btnRegister').click(register);
);

【讨论】:

以上是关于调用 API 时出现 404 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 Gitlab API 添加 SSH 密钥时出现 Http 404 错误

从链接调用另一个 JSP 时出现 404 错误

尝试从 JSP 表单调用 servlet 时出现 404 错误

使用 microsoft graph api c# 创建在线会议时出现 404 错误,但未登录 AzureActiveDirectory

使用移动浏览器请求自定义帖子类型时出现 Wordpress REST API 404 错误

从 django 视图上的 AJAX 调用获取请求时出现错误 404