2017-05-05 206 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); 
}