zoukankan      html  css  js  c++  java
  • ASP.NET Core 3.x RESTful API学习记录--内容协商

    Content Negotiation 内容协商 

    内容协商是这样一个过程:针对一个响应,当有多种表述格式可用的时候,选取最佳的一个表述。 

     

    当我们的RESTful API只面向一个API消费者的时候,也许只使用 JSON 一种格式是没有什么问题的。但是如果需要面向各种形式的多个API消费者,那么很有可能少数API消费者无法很好的解析JSON,它们可能更习惯于xml或者其它格式。 

     

    那么如何解决这个问题呢? 

    HTTP请求的 Accept Header 就是用来解决这个问题的,API的消费者在发送请求的时候,在Accept Header 里面填写好 Media Type(媒体类型),例如 application/json 或者 application/xml等等。 

    如果请求里填写的是 application/json,那么RESTful API返回响应的表述格式就应该是 json 

     

    而如果请求没有填写 Accept Header,那么 RESTful API 只好使用它的默认格式进行响应了。 

    如果在 Accept Header 里面填写的格式不被 RESTful API 所支持,那么倒是也可以返回默认的格式,但还是要尽量避免这种情况的出现,其实针对这种情况最好的办法是返回 406Not Acceptable 状态码,表示 API消费者请求的媒体类型是不可接受的,无法将其作为响应的格式。 

     

    综上,Accept Header 指的是输出格式。 

     ASP.NET Core 里面对应的就是 Output Formatters 

     

    而用于指定输入格式的 Header Content-Type,在 ASP.NET Core 里面对应的就是 Input formatter 

    例如 POST 请求的 body 就需要通过指定 Content-Type 来进行标识,这个 Header 可以看作是自描述性这个约束的一部分(每个消息必须包含足够的信息来知道如何对它进行处理)。 

           // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddControllers(setup =>
                {
                    setup.ReturnHttpNotAcceptable = true;//没有相应的类型返回406状态码
                    //setup.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter());//添加xml 输出格式 默认格式是json (旧)
                    setup.OutputFormatters.Insert(0, new XmlDataContractSerializerOutputFormatter());//修改默认格式(旧)
                }).AddXmlDataContractSerializerFormatters();//新写法
            }

     知识来源草根专栏 感谢杨旭大佬

  • 相关阅读:
    log4j学习
    数据库索引
    php 通过exec 创建git分支失败
    Nginx 常用全局变量 及Rewrite规则详解
    Jetbrains phpstorm pycharm 免费授权注册码
    Nginx return 关键字配置小技巧
    PHP 加密 和 解密 方法
    Nginx 禁用IP IP段
    Yii2 捕获错误日志
    transform 实现响应式绝对居中
  • 原文地址:https://www.cnblogs.com/cqqinjie/p/13363726.html
Copyright © 2011-2022 走看看