摘要
在開放api的時,我們需要返回不同的狀態給調用方,以告訴它們當前請求的結果,是成功了還是失敗了。當然這種給調用方的反饋有很多種做法,這里就說是web api內置的對Http狀態碼。http狀態碼基本上可以滿足日常接口開發的需要了。
HttpStatusCode
該枚舉有以下n種值:

#region 程序集 System.dll, v4.0.0.0 // C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.dll #endregion using System; namespace System.Net { // 摘要: // 包含為 HTTP 定義的狀態代碼的值。 public enum HttpStatusCode { // 摘要: // 等效於 HTTP 狀態 100。 System.Net.HttpStatusCode.Continue 指示客戶端可能繼續其請求。 Continue = 100, // // 摘要: // 等效於 HTTP 狀態 101。 System.Net.HttpStatusCode.SwitchingProtocols 指示正在更改協議版本或協議。 SwitchingProtocols = 101, // // 摘要: // 等效於 HTTP 狀態 200。 System.Net.HttpStatusCode.OK 指示請求成功,且請求的信息包含在響應中。 這是最常接收的狀態代碼。 OK = 200, // // 摘要: // 等效於 HTTP 狀態 201。 System.Net.HttpStatusCode.Created 指示請求導致在響應被發送前創建新資源。 Created = 201, // // 摘要: // 等效於 HTTP 狀態 202。 System.Net.HttpStatusCode.Accepted 指示請求已被接受做進一步處理。 Accepted = 202, // // 摘要: // 等效於 HTTP 狀態 203。 System.Net.HttpStatusCode.NonAuthoritativeInformation 指示返回的元信息來自緩存副本而不是原始服務器,因此可能不正確。 NonAuthoritativeInformation = 203, // // 摘要: // 等效於 HTTP 狀態 204。 System.Net.HttpStatusCode.NoContent 指示已成功處理請求並且響應已被設定為無內容。 NoContent = 204, // // 摘要: // 等效於 HTTP 狀態 205。 System.Net.HttpStatusCode.ResetContent 指示客戶端應重置(或重新加載)當前資源。 ResetContent = 205, // // 摘要: // 等效於 HTTP 狀態 206。 System.Net.HttpStatusCode.PartialContent 指示響應是包括字節范圍的 GET // 請求所請求的部分響應。 PartialContent = 206, // // 摘要: // 等效於 HTTP 狀態 300。 System.Net.HttpStatusCode.MultipleChoices 指示請求的信息有多種表示形式。 // 默認操作是將此狀態視為重定向,並遵循與此響應關聯的 Location 標頭的內容。 MultipleChoices = 300, // // 摘要: // 等效於 HTTP 狀態 300。 System.Net.HttpStatusCode.Ambiguous 指示請求的信息有多種表示形式。 默認操作是將此狀態視為重定向,並遵循與此響應關聯的 // Location 標頭的內容。 Ambiguous = 300, // // 摘要: // 等效於 HTTP 狀態 301。 System.Net.HttpStatusCode.MovedPermanently 指示請求的信息已移到 Location // 頭中指定的 URI 處。 接收到此狀態時的默認操作為遵循與響應關聯的 Location 頭。 MovedPermanently = 301, // // 摘要: // 等效於 HTTP 狀態 301。 System.Net.HttpStatusCode.Moved 指示請求的信息已移到 Location 頭中指定的 // URI 處。 接收到此狀態時的默認操作為遵循與響應關聯的 Location 頭。 原始請求方法為 POST 時,重定向的請求將使用 GET 方法。 Moved = 301, // // 摘要: // 等效於 HTTP 狀態 302。 System.Net.HttpStatusCode.Found 指示請求的信息位於 Location 頭中指定的 // URI 處。 接收到此狀態時的默認操作為遵循與響應關聯的 Location 頭。 原始請求方法為 POST 時,重定向的請求將使用 GET 方法。 Found = 302, // // 摘要: // 等效於 HTTP 狀態 302。 System.Net.HttpStatusCode.Redirect 指示請求的信息位於 Location 頭中指定的 // URI 處。 接收到此狀態時的默認操作為遵循與響應關聯的 Location 頭。 原始請求方法為 POST 時,重定向的請求將使用 GET 方法。 Redirect = 302, // // 摘要: // 等效於 HTTP 狀態 303。 作為 POST 的結果,System.Net.HttpStatusCode.SeeOther 將客戶端自動重定向到 // Location 頭中指定的 URI。 用 GET 生成對 Location 標頭所指定的資源的請求。 SeeOther = 303, // // 摘要: // 等效於 HTTP 狀態 303。 作為 POST 的結果,System.Net.HttpStatusCode.RedirectMethod 將客戶端自動重定向到 // Location 頭中指定的 URI。 用 GET 生成對 Location 標頭所指定的資源的請求。 RedirectMethod = 303, // // 摘要: // 等效於 HTTP 狀態 304。 System.Net.HttpStatusCode.NotModified 指示客戶端的緩存副本是最新的。 未傳輸此資源的內容。 NotModified = 304, // // 摘要: // 等效於 HTTP 狀態 305。 System.Net.HttpStatusCode.UseProxy 指示請求應使用位於 Location 頭中指定的 // URI 的代理服務器。 UseProxy = 305, // // 摘要: // 等效於 HTTP 狀態 306。 System.Net.HttpStatusCode.Unused 是未完全指定的 HTTP/1.1 規范的建議擴展。 Unused = 306, // // 摘要: // 等效於 HTTP 狀態 307。 System.Net.HttpStatusCode.RedirectKeepVerb 指示請求信息位於 Location // 頭中指定的 URI 處。 接收到此狀態時的默認操作為遵循與響應關聯的 Location 頭。 原始請求方法為 POST 時,重定向的請求還將使用 // POST 方法。 RedirectKeepVerb = 307, // // 摘要: // 等效於 HTTP 狀態 307。 System.Net.HttpStatusCode.TemporaryRedirect 指示請求信息位於 Location // 頭中指定的 URI 處。 接收到此狀態時的默認操作為遵循與響應關聯的 Location 頭。 原始請求方法為 POST 時,重定向的請求還將使用 // POST 方法。 TemporaryRedirect = 307, // // 摘要: // 等效於 HTTP 狀態 400。 System.Net.HttpStatusCode.BadRequest 指示服務器未能識別請求。 如果沒有其他適用的錯誤,或者不知道准確的錯誤或錯誤沒有自己的錯誤代碼,則發送 // System.Net.HttpStatusCode.BadRequest。 BadRequest = 400, // // 摘要: // 等效於 HTTP 狀態 401。 System.Net.HttpStatusCode.Unauthorized 指示請求的資源要求身份驗證。 WWW-Authenticate // 頭包含如何執行身份驗證的詳細信息。 Unauthorized = 401, // // 摘要: // 等效於 HTTP 狀態 402。 保留 System.Net.HttpStatusCode.PaymentRequired 以供將來使用。 PaymentRequired = 402, // // 摘要: // 等效於 HTTP 狀態 403。 System.Net.HttpStatusCode.Forbidden 指示服務器拒絕滿足請求。 Forbidden = 403, // // 摘要: // 等效於 HTTP 狀態 404。 System.Net.HttpStatusCode.NotFound 指示請求的資源不在服務器上。 NotFound = 404, // // 摘要: // 等效於 HTTP 狀態 405。 System.Net.HttpStatusCode.MethodNotAllowed 指示請求的資源上不允許請求方法(POST // 或 GET)。 MethodNotAllowed = 405, // // 摘要: // 等效於 HTTP 狀態 406。 System.Net.HttpStatusCode.NotAcceptable 指示客戶端已用 Accept 頭指示將不接受資源的任何可用表示形式。 NotAcceptable = 406, // // 摘要: // 等效於 HTTP 狀態 407。 System.Net.HttpStatusCode.ProxyAuthenticationRequired 指示請求的代理要求身份驗證。 // Proxy-authenticate 頭包含如何執行身份驗證的詳細信息。 ProxyAuthenticationRequired = 407, // // 摘要: // 等效於 HTTP 狀態 408。 System.Net.HttpStatusCode.RequestTimeout 指示客戶端沒有在服務器期望請求的時間內發送請求。 RequestTimeout = 408, // // 摘要: // 等效於 HTTP 狀態 409。 System.Net.HttpStatusCode.Conflict 指示由於服務器上的沖突而未能執行請求。 Conflict = 409, // // 摘要: // 等效於 HTTP 狀態 410。 System.Net.HttpStatusCode.Gone 指示請求的資源不再可用。 Gone = 410, // // 摘要: // 等效於 HTTP 狀態 411。 System.Net.HttpStatusCode.LengthRequired 指示缺少必需的 Content-length // 頭。 LengthRequired = 411, // // 摘要: // 等效於 HTTP 狀態 412。 System.Net.HttpStatusCode.PreconditionFailed 指示為此請求設置的條件失敗,且無法執行此請求。 // 條件是用條件請求標頭(如 If-Match、If-None-Match 或 If-Unmodified-Since)設置的。 PreconditionFailed = 412, // // 摘要: // 等效於 HTTP 狀態 413。 System.Net.HttpStatusCode.RequestEntityTooLarge 指示請求太大,服務器無法處理。 RequestEntityTooLarge = 413, // // 摘要: // 等效於 HTTP 狀態 414。 System.Net.HttpStatusCode.RequestUriTooLong 指示 URI 太長。 RequestUriTooLong = 414, // // 摘要: // 等效於 HTTP 狀態 415。 System.Net.HttpStatusCode.UnsupportedMediaType 指示請求是不支持的類型。 UnsupportedMediaType = 415, // // 摘要: // 等效於 HTTP 狀態 416。 System.Net.HttpStatusCode.RequestedRangeNotSatisfiable 指示無法返回從資源請求的數據范圍,因為范圍的開頭在資源的開頭之前,或因為范圍的結尾在資源的結尾之后。 RequestedRangeNotSatisfiable = 416, // // 摘要: // 等效於 HTTP 狀態 417。 System.Net.HttpStatusCode.ExpectationFailed 指示服務器未能符合 Expect // 頭中給定的預期值。 ExpectationFailed = 417, // UpgradeRequired = 426, // // 摘要: // 等效於 HTTP 狀態 500。 System.Net.HttpStatusCode.InternalServerError 指示服務器上發生了一般錯誤。 InternalServerError = 500, // // 摘要: // 等效於 HTTP 狀態 501。 System.Net.HttpStatusCode.NotImplemented 指示服務器不支持請求的函數。 NotImplemented = 501, // // 摘要: // 等效於 HTTP 狀態 502。 System.Net.HttpStatusCode.BadGateway 指示中間代理服務器從另一代理或原始服務器接收到錯誤響應。 BadGateway = 502, // // 摘要: // 等效於 HTTP 狀態 503。 System.Net.HttpStatusCode.ServiceUnavailable 指示服務器暫時不可用,通常是由於過多加載或維護。 ServiceUnavailable = 503, // // 摘要: // 等效於 HTTP 狀態 504。 System.Net.HttpStatusCode.GatewayTimeout 指示中間代理服務器在等待來自另一個代理或原始服務器的響應時已超時。 GatewayTimeout = 504, // // 摘要: // 等效於 HTTP 狀態 505。 System.Net.HttpStatusCode.HttpVersionNotSupported 指示服務器不支持請求的 // HTTP 版本。 HttpVersionNotSupported = 505, } }
一個簡單的例子
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; namespace Wolfy.HttpStatusDemo.Controllers { public class TestController : ApiController { [HttpGet] [Route("api/user/{id:int}")] public HttpResponseMessage FindUser(int id) { HttpResponseMessage message = new HttpResponseMessage(); if (id == 1) { //模擬 查詢 存在 message.StatusCode = HttpStatusCode.OK; message.Content = new StringContent(JsonConvert.SerializeObject(new { id = id, name = "wolfy" })); } else { //模擬 查詢 不存在 message.StatusCode = HttpStatusCode.NotFound; message.Content = new StringContent(""); } return message; } [HttpPost] [Route("api/user")] public HttpResponseMessage CreateUser() { object user = new { id = 2, name = "zhangsan" }; HttpResponseMessage message = new HttpResponseMessage(); message.StatusCode = HttpStatusCode.Created; message.Content = new StringContent(JsonConvert.SerializeObject(user)); return message; } } }
前端調用
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <script src="Scripts/jquery-3.1.1.js"></script> <script> $(function () { $.ajax({ url: "api/user/1", cache: false, type: "get", contentType: "application/json", statusCode: { 200: function (data) { console.log(data); }, 404: function (data) { console.log(data); console.log("not found"); } }, }); }); </script> </head> <body> </body> </html>
測試
不存在
創建
$.ajax({ url: "api/user", cache: false, type: "POST", contentType: "application/json", statusCode: { 200: function (data) { console.log(data); }, 404: function (data) { console.log(data); console.log("not found"); }, 201: function (data) { console.log(data); } }, });
總結
Http狀態碼在實際操作中,足夠響應操作的實際處理結果了。當然,如果想自定義,也可以在message.content中自定義一個code來代表你的操作是否成功。