现在,当谈论起 RESTful Web API 的时候,人们总会想到 JSON。但是实际上,JSON 和 RESTful API 没有半毛钱关系,只不过 JSON 恰好是RESTful API 结果的表述格式。也就是说 RESTful API 还可以使用其它的表述格式,例如 xml 或私有的格式。这也就意味着,我们需要让 RESTful API 知道我们想要返回的格式。而这就是HTTP请求和响应的核心内容之一:

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 所支持,那么倒是也可以返回默认的格式,但还是要尽量避免这种情况的出现,其实针对这种情况最好的办法是返回 406(Not Acceptable) 状态码,表示 API消费者请求的媒体类型是不可接受的,无法将其作为响应的格式。

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

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

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

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

官方详细文档请点击原文链接。

使用ASP.NET Core 3.x 构建 RESTful API - 3.4 内容协商相关推荐

  1. 使用ASP.NET Core 3.x 构建 RESTful API - 2. 什么是RESTful API

    1. 使用ASP.NET Core 3.x 构建 RESTful API - 1.准备工作 什么是REST REST一词最早是在2000年,由Roy Fielding在他的博士论文<Archit ...

  2. 使用ASP.NET Core 3.x 构建 RESTful API - 1. 开始

    以前写过ASP.NET Core 2.x的REST API文章,今年再更新一下到3.0版本. 预备知识:ASP.NET Core 和 C# 工具:Visual Studio 2019最新版(VSCod ...

  3. 使用ASP.NET Core 3.x 构建 RESTful API - 4.2 过滤和搜索

    向Web API传递参数 数据可以通过多种方式来传给API. Binding Source Attributes 会告诉 Model 的绑定引擎从哪里找到绑定源. 共有以下六种 Binding Sou ...

  4. 使用ASP.NET Core 3.x 构建 RESTful API - 3.1 API资源命名

    为了与RESTful API进行交互,API消费者需要使用到三个概念: 资源的标识.也就是可以找到资源的URI. HTTP方法.例如GET,POST等等,这些方法是HTTP协议的一部分. 有效载荷(可 ...

  5. 使用ASP.NET Core 3.x 构建 RESTful API - 3.3.3 ProblemDetails

    当ASP.NET Core 大约在 2.1 版本的时候,它引入了 ProblemDetails.ProblemDetails是基于 RFC7807 这个规范,目的是让 HTTP 响应可以携带错误的详细 ...

  6. 使用ASP.NET Core 3.x 构建 RESTful API - 3.2 路由

    路由机制会把一个请求的URI映射到一个Controller上面的Action,所以当你发送一个HTTP请求的时候,MVC框架会解析这个请求的URI,并尝试着把它映射到一个Controller上面的Ac ...

  7. 使用ASP.NET Core 3.x 构建 RESTful API - 3.2 开始建立Controller和Action

    Demo 下面我们就来实践一下.打开之前的项目,并建立CompaniesController: 这里有6个地方比较关键,我们挨个看一下: RESTful API 或者其它Web API的Control ...

  8. 使用ASP.NET Core 3.x 构建 RESTful API - 4.1 面向外部的Model

    Entity Framework Core 使用的 Entity Model 是用来表示数据库里面的记录的. 而面向外部的 model 则表示了要传输的东西.这类 model 有时候叫做 Dto,有时 ...

  9. 使用ASP.NET Core 3.x 构建 RESTful API - 4.3 HTTP 方法的安全性和幂等性

    什么样的HTTP方法是安全的? 如果一个方法不会改变资源的表述,那么这个方法就被认为是安全的. 例如 HTTP GET 和 HTTP HEAD 就被认为是安全的,但需要注意的是,这并不意味着执行GET ...

最新文章

  1. 在SQLserver数据库里设置作业的步骤
  2. 雷军的“初恋”回来了
  3. 好物推荐 | 直男の送礼指南(下周七夕,欲买从速
  4. Linux中字符设备注册方式,3.4. 字符设备注册
  5. 【面向对象】类的特殊成员方法
  6. windows7怎么恢复出厂设置_电脑恢复出厂设置会怎么样图文教程_windows7教程
  7. IOS 中视图控制器的生命周期
  8. 小强升职记梗概_时间管理法 ——《小强升职记》读书笔记 1
  9. 深度学习弯道超车,领先行业不止一点点
  10. 引commons-io工具类做文件的复制及导出
  11. 一个程序说明java中this关键字
  12. 实验11——指针的基础应用
  13. 在 Activity 中添加 Menu 菜单
  14. 用scribefire写blog
  15. Java就业方向有哪些?
  16. 音乐计算机锦鲤抄,十首古风歌曲,锦鲤抄上榜,哪一首是你心目中的古风“神曲”?...
  17. 【JavaScript 教程】第六章 数组11— filter() :过滤数组中的元素
  18. Windows批处理程序编程学习笔记
  19. 在数据库应用系统中数据库的开发
  20. 5 款必备的免费在线画图工具!超级好用

热门文章

  1. Kinect开发笔记之五使用PowerShell控制Kinect
  2. IT:如何使用Server 2008 R2上的远程桌面服务设置自己的终端服务器
  3. 通过从备份中排除这些文件夹来节省Time Machine驱动器上的空间
  4. Https 加密原理分析
  5. 翻译:用户变量(User-Defined Variable)(已提交到MariaDB官方手册)
  6. javaIo流实际应用
  7. Http协议Get方式获取图片
  8. iNeuOS工业互联网操作系统,顺利从NetCore3.1升级到Net6的过程汇报,发布3.7版本...
  9. 技术分享 | 混合云模式下SaaS端前端最佳实践
  10. .NET6之MiniAPI(八):日志