2017-05-05 152 views
0

我正在学习jQuery的web api。如何用ajax返回“失败”请求?

这里是我的插件做出POST请求:

$.postAPI = function (url, data) { 
    let defer = $.Deferred(); 

    let onSuccess = function (data) { 
     defer.resolve(data); 
    }; 

    let onError = function (error) { 
     defer.reject(error); 
    }; 

    $.ajax({ 
     url: url, 
     method: 'POST', 
     data: data || null 
    }).done(onSuccess).fail(onError); 

    return defer; 
}; 

API控制器:

[Route("api/user")] 
public class UserApiController : Controller 
{ 
    [HttpPost("{userid?}")] 
    public IActionResult GetData(string userid) 
    { 
     if (!string.IsNullOrEmpty(userid)) 
     { 
      return Ok(userid); 
     } 
     return new StatusCodeResult(401); 

     // also try with 
     // return BadRequest(); 
     // return Unauthorized(); 
    } 
} 

测试:

$.postAPI('/api/user/getdata').done(function (data) { 
    console.log('success:', data); 
}).fail(function (e) { console.log('fail:', e); }); 

但我一直有这个日志:

成功:getdata

我想让请求变成fail。因此,日志可能:

失败:...

我的问题:我如何才能做到这一点?

UPDATE:

我一直在努力,这条线(基于评论)地址:

Response.StatusCode = 404; 

的方法。但问题没有解决。

快照: 1

+0

为了您的请求失败(或错误出)后端必须返回一个错误代码,如404或500,我不知道jQuery可以模拟此。尝试改变你的后端代码。 – silkfire

+3

您需要从服务器更改200以外的返回HTTP响应代码 –

+0

@AgamBanga我试着添加'Response.StatusCode = 404;'但它仍然不起作用。我仍然有相同的日志。 – Vayne

回答

1

如果你所说的 “API /用户” 这会直接调用你的函数 “的GetData”,因为你有一个定义的函数的路由。

url api/user/getdata中的“getdata”部分将被解释为您的“userid”,因此if (!string.IsNullOrEmpty(userid))将始终返回true。

如果您在没有“getdata”部分的情况下调用“api/user”,它应该会失败。

如果你想使用的GetData作为网址,你可以添加一个路由的功能,像这样保持:

[HttpPost("GetData/{userId?}")] 
public IActionResult GetData(string userid) 
{ 
    if (!string.IsNullOrEmpty(userid)) 
    { 
     return Ok(userid); 
    } 
    return BadRequest(); 
} 

参见: https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing

+0

谢谢!它正在工作。我可以有另一个问题吗?在将'BadRequest'更改为'Unauthorized'后,为什么日志仍会抛出'404'错误?图片:http://i.imgur.com/o4DNsns.png – Vayne

+0

我的意思是:状态码应该是401而不是404 – Vayne

+0

可能是路由区分大小写:尝试'[HttpPost(“getdata/{userId?}” )]' –

0

试试这个:

[HttpPost("{userid?}")] 
public IActionResult GetData(string userid) 
{ 
    if (!string.IsNullOrEmpty(userid)) 
    { 
     return View(new ViewModel(userid)); 
    } 

    return StatusCode(401); 
}