zoukankan      html  css  js  c++  java
  • Web API中给领域模型添加媒体类型支持

    一、媒体类型

      媒体类型(也称为MIME类型)标识一段数据的格式。在HTTP中,媒体类型描述了消息体的格式。媒体类型由两个字符串组成,一个类型和一个子类型。例如:text / html; image/ PNG ;application/ JSON
    在HTTP中,Response的 Content-Type 标头指定消息主体的格式。这告诉接收者如何解析消息体的内容。

    HTTP/1.1 200 OK
    Content-Length: 95267
    Content-Type: image/png

    Request中的 Accept 标头告诉服务器客户端希望从服务器获取哪些媒体类型。

    Accept: text/html,application/xhtml+xml,application/xml

    此标头告诉服务器客户端需要HTML,XHTML或XML。
      媒体类型用于确定Web API如何序列化和反序列化HTTP消息正文。Web API内置支持XML,JSON,BSON和表单urlencoded数据,我们也可以编写 媒体格式化程序(media-type formatter ) 来支持其他媒体器。媒体格式化器的作用是:

    Read CLR objects from an HTTP message body
    Write CLR objects into an HTTP message body

    要创建媒体格式化器,请从以下类之一派生:

    MediaTypeFormatter。该类使用异步读写方法。
    BufferedMediaTypeFormatter。此类派生自MediaTypeFormatter,使用同步读/写方法,简单但是会读写期间阻塞线程。

    从BufferedMediaTypeFormatter派生更简单,因为没有异步代码,但它也意味着调用线程会在I / O期间阻塞。

    二、一个创建媒体格式的栗子

    需求:为Book模型创建CSV媒体格式化程序,用于将Book对象序列化为逗号分隔值格式的媒体类型(CSV)。以下是Book对象的定义:

    public class Book
    {
      public int BookId { get; set; }
      public string Title{ get; set; }
      public string Genre { get; set; }
      public decimal Price { get; set; }
    }

    第一步:创建一个BookCsvFormatter

    BookCsvFormatter继承于BufferedMediaTypeFormater类:

    public class BookCsvFormatter : BufferedMediaTypeFormatter
    {
          //构造函数
          public BookCsvFormatter()
          {    
          //添加支持的Mime类型 SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/csv")); // 添加支持的编码类型     SupportedEncodings.Add(new UTF8Encoding(encoderShouldEmitUTF8Identifier: false));     SupportedEncodings.Add(Encoding.GetEncoding("iso-8859-1")); }
    //实现BufferedMediaTypeFormatter抽象方法,是否可读 public override bool CanReadType(Type type) { //不可读 return false; }

       //实现BufferedMediaTypeFormatter抽象方法,是否可写    public override bool CanWriteType(Type type)   { if (type == typeof(Book)) { return true;} else     {       //支持csv类型集合的读取       Type enumbook = typeof(IEnumerable<Book>);       return enumbook.IsAssignableFrom(type);       }     } 

        //重写写入方法     public override void WriteToStream(Type type, object value, Stream writeStream, HttpContent content)     {       //通过httpcontent获取编码类型       Encoding currentEncoding = SelectCharacterEncoding(content.Headers);       using (var writer=new StreamWriter(writeStream, currentEncoding))       {         var books = value as IEnumerable<Book>;         if (books!=null)         {           foreach (var book in books)           {             WriteItem(book, writer);           }          }         else         {           var singleBook = value as Book;           if (singleBook == null)           {             throw new InvalidOperationException("不能序列化该类型");           }           WriteItem(singleBook, writer);         }        }       }     public void WriteItem(Book book, StreamWriter writer) {       writer.WriteLine($"{book.BookId.ToString()},{book.Title.ToString()},{book.Genre.ToString()},{book.Price.ToString()}");       }     }

    第二步:将BookCsvFormatter程序添加到Web API管道

    打开WebApiConfig.cs,添加以下代码

    public static void ConfigureApis(HttpConfiguration config)
    {
        //添加这行代码
        config.Formatters.Add(new BookCsvFormatter ()); 
    }

    第三步:测试

    在BooksController中添加控制器如下

     [Route("~/api/books/helloCsv")]
     public HttpResponseMessage GetBook()
     {
         Book book = new Book { BookId=1,Title="哈利波特",Genre="玄幻",Price=59.99M}; 
         return Request.CreateResponse(HttpStatusCode.OK, book, "text/csv");
     }

    重新生成后启动在url填入http://localhost:60398/api/books/helloCsv,会直接下载一个名字为helloCsv的文件

     

    打开记事本打开helloCsv,内容是:1,哈利波特,玄幻,59.99 ,测试成功。

    本文实现了一个简单的添加媒体类型的方法,如果想了解更多请查看官网

  • 相关阅读:
    C#之Raw Socket实现网络封包监视
    es6Promise及小程序Promise用法
    在微信小程序的JS脚本中使用Promise来优化函数处理
    小程序踩过的一个小坑---解析二维码decodeURIComponent() url解码
    js json转url参数
    微信小程序-实现分享(带参数)
    php中的匿名函数和闭包(closure)
    微信小程序之回调函数
    php AES cbc模式 pkcs7 128位加密解密(微信小程序)
    微信小程序,开发中几个重要的知识点(加密解密,转发,进入场景,session_key)
  • 原文地址:https://www.cnblogs.com/wyy1234/p/9479851.html
Copyright © 2011-2022 走看看