zoukankan      html  css  js  c++  java
  • ASP.NET WebAPI 03 返回结果

    在WebAPI中HttResponseMessage作为消息返回,而在ApiController中我们经常讲四类数据作为返回值,void,object(可序列化),IHttpActionResult,HttpResponseMessage,

    Void与object

    Void:返回状态码200,无数据

    Object: 返回状态码200,数据

    IHttpActionResult

        public interface IHttpActionResult
        {
    
            Task<System.Net.Http.HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);
        }
    }
    

      

    WebAPI为我们定义了一IHttpActionResult接口,从命名我们就可以来它是作为Action执行的返回结果。

    在WebAPI总已经定义了很多实现了IHttpActionResult的类:

    这些类大致可以分为:只有状态码,重定向,实体序列化,错误信息,201Created等几类。

    状态码

    CodeStatusResult:指定状态码

    BadRequestResult:400

    OkResult:200

    NotFoundResult:404

    UnAuthorizedResult:401

    ConflictResult:409

    InternalServerErrorResult:500

    重定向

    状态码302,并返回重定向url

    RedirectResult:按绝对路径

    RedirectToRouteResult:按路由

    WebApi为我们提供了一个UrlHelp类,可实现路由向绝对路径的转换

                IDictionary<string, object> route = new Dictionary<string, object>();
                UrlHelper helper = new UrlHelper(Request);
                route["controller"] = "Figure";
                route["action"] = "GetAll";
                string AbsoluteUrl = helper.Link("DefaultApi", route);
    

      

    实体序列化

    FormattedContentResult<T>:自定义序列化方式与状态码

    NegotiatedContentResult<T>:自定义状态码,根据请求头信息匹配序列化类型

    OkNegotiatedContentResult<T>:状态码200,根据请求头信息匹配序列化类型

    JsonResult<T>:状态码200,Json序列化

    错误信息

    ExceptionResult:500, eg: {"Message":"出现错误。","ExceptionMessage":"未实现该方法或操作。","ExceptionType":"System.NotImplementedException","StackTrace":null}

    BadRequestErrorMessageResult:400,eg: {"Message":"Error"}

    InvalidModelStateResult:400,Model绑定错误,eg: {"Message":"请求无效。","ModelState":{"argument":["值不在预期的范围内。"],"implemented":["未实现该方法或操作。"]}}

    这三种类型最终都是装换成HttpError

    201 Created

    CreatedNegotiatedContentResult<T>与CreatedAtRouteNegotiatedContentResult<T>

    返回"201 Created"的状态。

    同时ApiController也为我们定义许多返回IHttpActionResult的方法

        public abstract class ApiController
        {
           
            protected internal virtual InvalidModelStateResult BadRequest(ModelStateDictionary modelState);
     
            protected internal virtual NegotiatedContentResult<T> Content<T>(HttpStatusCode statusCode, T value);
        
            protected internal FormattedContentResult<T> Content<T>(HttpStatusCode statusCode, T value, MediaTypeFormatter formatter);
         
            protected internal virtual FormattedContentResult<T> Content<T>(HttpStatusCode statusCode, T value, MediaTypeFormatter formatter, MediaTypeHeaderValue mediaType);
         
            protected internal FormattedContentResult<T> Content<T>(HttpStatusCode statusCode, T value, MediaTypeFormatter formatter, string mediaType);
         
            protected internal CreatedNegotiatedContentResult<T> Created<T>(string location, T content);
         
            protected internal virtual CreatedNegotiatedContentResult<T> Created<T>(Uri location, T content);
        
            protected internal virtual CreatedAtRouteNegotiatedContentResult<T> CreatedAtRoute<T>(string routeName, IDictionary<string, object> routeValues, T content);
        
            protected internal CreatedAtRouteNegotiatedContentResult<T> CreatedAtRoute<T>(string routeName, object routeValues, T content);


        
            protected internal virtual InternalServerErrorResult InternalServerError();
        
            protected internal virtual ExceptionResult InternalServerError(Exception exception);
        
            protected internal JsonResult<T> Json<T>(T content);
     
            protected internal JsonResult<T> Json<T>(T content, JsonSerializerSettings serializerSettings);
       
            protected internal virtual JsonResult<T> Json<T>(T content, JsonSerializerSettings serializerSettings, Encoding encoding);
         
            protected internal virtual NotFoundResult NotFound();
        
            protected internal virtual OkResult Ok();
       
            protected internal virtual OkNegotiatedContentResult<T> Ok<T>(T content);
        
            protected internal virtual RedirectResult Redirect(string location);

            protected internal virtual RedirectResult Redirect(Uri location);
        
            protected internal virtual RedirectToRouteResult RedirectToRoute(string routeName, IDictionary<string, object> routeValues);
       
            protected internal RedirectToRouteResult RedirectToRoute(string routeName, object routeValues);
         
            protected internal virtual ResponseMessageResult ResponseMessage(HttpResponseMessage response);
          
            protected internal virtual StatusCodeResult StatusCode(HttpStatusCode status);
         
            protected internal virtual UnauthorizedResult Unauthorized(IEnumerable<AuthenticationHeaderValue> challenges);
         
            protected internal UnauthorizedResult Unauthorized(params AuthenticationHeaderValue[] challenges);
           
        }

    HttpResponseMessage

    HttpResponseMessage表示包括状态代码和数HTTP 响应消息。在整个WebAPI中HttpResponseMessage是作为最终的请求结果,自然HttpResponseMessag可以作为Action的返回结果。如果单从返回数据上看我们可以只关心状态码(StatusCode),内容(Content),头信息(Headers)。

        public class HttpResponseMessage : IDisposable
        {
            public HttpResponseMessage();
            public HttpResponseMessage(HttpStatusCode statusCode);
    
            public HttpContent Content { get; set; }
            public HttpResponseHeaders Headers { get; }
            public HttpStatusCode StatusCode { get; set; }
       
    
        }
    

      

    其实WebAPI定义了一个ResponseMessageResult,这个类实现了IHttpActionResult接口,这个类只重载了一个构造函数,定义了一个HttpResponseResult的属性

        public class ResponseMessageResult : IHttpActionResult
        {
    
            public ResponseMessageResult(HttpResponseMessage response);
    
    
            public HttpResponseMessage Response { get; }
    
            public virtual Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);
        }
    

      

    其中WebAPI为我们定义很多HttpContent的派生类。

    ByteArrayContent

    FormUrlEncodedContent

    MultipartContent

    MultipartFormDataContent

    StreamContent

    StringContent

    不管是Void,object,IHttpActionResult都将生成HttpResponseMessage。

    IhttpActionResult接口中只定义了一个ExecuteAsync方法

    Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);

    所以IHttpActionResult可以很容易得到HttpResponseMessage

    源码

    Github: https://github.com/BarlowDu/WebAPI (API_3)

  • 相关阅读:
    CSU 1333 Funny Car Racing
    FZU 2195 检查站点
    FZU 2193 So Hard
    ZOJ 1655 FZU 1125 Transport Goods
    zoj 2750 Idiomatic Phrases Game
    hdu 1874 畅通工程续
    hdu 2489 Minimal Ratio Tree
    hdu 3398 String
    洛谷 P2158 [SDOI2008]仪仗队 解题报告
    POJ 1958 Strange Towers of Hanoi 解题报告
  • 原文地址:https://www.cnblogs.com/gangtianci/p/4776841.html
Copyright © 2011-2022 走看看