RestfulApi 学习笔记——内容协商(三)
前言
什么是内容协商呢?是这样的,我们在请求的时候都有两个属性,一个是Content-Type,另一个是accept,这两个什么意思呢?
content-type 这个是表示自己传输的是什么内容,就像我们自动绑定参数的时候,我们既要知道从哪里获取,也要知道如何解析啊,不然该按哪种方式提取呢。
accept 这个是就像这个英文但是意思一样,接受,表示接受什么样的类型的返回类型。其实我们返回的全部是字节,到了我们前端转换为字符流,那么根据这个accept 再来解析。
看一下content-type 的参数:
Content-Type:type/subtype ;parameter
type:主类型,任意的字符串,如text,如果是号代表所有;
subtype:子类型,任意的字符串,如html,如果是号代表所有,用“/”与主类型隔开;
parameter:可选参数,如charset,boundary等。
这里举一个content-type 的例子哈:
Content-Type application/x-www-form-urlencoded; charset=UTF-8
这个是什么意思呢?比如说,有几个参数key=1 name=x,那么它将会这样传输key=1&name=x,然后放在body中,但是放之前会将一些特殊字符转码,比如说空格转换为%20。
再举一个例子吧:
Content-Type multipart/form-data;
这个相比大家非常的熟悉了,就是大名鼎鼎的form-data,这个和json还有xml不同,这个可以传递文件,所以主类型叫做多媒体类型multipart。
首先生成了一个 boundary 用于分割不同的字段,在请求实体里每个参数以------boundary开始,然后是附加信息和参数名,然后是空行,最后是参数内容。多个参数将会有多个boundary块。如果参数是文件会有特别的文件域。最后以------boundary–为结束标识。
为了更加形象的展示出,决定去网上弄一张图片。

大概是这样了。其他的就不介绍了,accept和这个差不多。下面就进入正文,我们写代码如何和后台协商呢?至于具体的解析,我们就不要去写了,毕竟够用,没必要自己去定义类型吧。
正文
首先我们要有一个步骤,或者说错误性验证。
就是如假设Content-Type 客户端填写的内容,不被我们服务器接受,那么我们作为服务器,我们要怎么做?
我们这个时候应该返回415错误,也就是Unsupported Media Type就是服务器不支持该媒体类型。
如果accept 无法满足客户端的请求,那么就应该返回406,服务器无法满足客户端,也急速no acceptable,不支持吧。
举个例子,我要请求某个公司的资料,然后返回application/json:

这时候其乐融融,满足了,那么我现在要返回xml。这时候出现问题了,明明我要的是xml,你给我json,我以为自己得到的是xml,结果解析失败。
这个时候就是服务器问题了,因为服务器没有提示406,不能满足对方。
在ConfigureServices 中配置一下,如下:
services.AddControllers(setup =>
{
setup.ReturnHttpNotAcceptable = true;
});
再请求一次406了,如下:

如果针对xml格式的话,我们如何返回json 又能返回xml,是写两个方法吗?不是的,我们可以做一些配置,让.net core框架自动来转换,果然框架才是第一生产力。
只要加刚才的基础上加上:setup.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter());。
那么如果你想默认的返回格式是xml,那么你应该xml放在第一位:setup.OutputFormatters.Add(0,new XmlDataContractSerializerOutputFormatter())
这里简单介绍一下,.net core的OutputFormatters 表示的是输出格式化,那么还有输入格式化。InputFormatters 就是对media type的控制了。
那么看一下效果吧:

有些人可能这样没有效果,那么你返回可能是这样写的:return new JsonResult(company);,这个时候已经写死了格式,返回的还是json,并且服务器支持了xml所以也不会406,所以还是建议这样写ok(company)。
那么到这里就介绍这一小结,这里就有人问了,为啥不介绍Content-Type呢?因为系统默认支持全部,当然你可以通过InputFormatters 删除一些。。。比如setup.InputFormatters.Remove..
记得我前面提及过,apicontroller可以自动帮我们处理40x错误,比如415,默认解析是form-data,如果你没有传任何form-data,那么就是为空,空的是不可能是formdata类型,那么服务器解析不了那么就是415,这个新手还是遇到概率还是很高的。如果你写的int id,传过来的是一个string,那么会返回400,One or more validation errors occurred。
RestfulApi 学习笔记——内容协商(三)的更多相关文章
- PyQt4入门学习笔记(三)
# PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...
- C#可扩展编程之MEF学习笔记(三):导出类的方法和属性
前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下MEF是如何导出方法和属性的. 还是前面的代码,第二篇中已经提供 ...
- X-Cart 学习笔记(三)X-Cart框架2
目录 X-Cart 学习笔记(一)了解和安装X-Cart X-Cart 学习笔记(二)X-Cart框架1 X-Cart 学习笔记(三)X-Cart框架2 X-Cart 学习笔记(四)常见操作 3.了解 ...
- Dynamic CRM 2013学习笔记(三十三)自定义审批流4 - 规则节点 -有分支的流程处理
上次介绍过节点的基本配置<Dynamic CRM 2013学习笔记(三十二)自定义审批流3 - 节点及实体配置>,这次介绍下规则节点,因为有时流程里会有一些分支.合并,这时就要用到规则节点 ...
- Dynamic CRM 2013学习笔记(三十七)自定义审批流7 - 初始化(整套审批流下载、安装)
前面介绍了自定义审批流的配置.使用,这篇介绍下如何进行初始化. 一. 下载 从下面的地址下载整个审批流: http://yunpan.cn/cZ5Rdx5HCt3VF 下载完后,一共有三块内容: 二. ...
- .NET Remoting学习笔记(三)信道
目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 参考:♂风车车.Net .NET Framework ...
- opencv学习笔记(三)基本数据类型
opencv学习笔记(三)基本数据类型 类:DataType 将C++数据类型转换为对应的opencv数据类型 OpenCV原始数据类型的特征模版.OpenCV的原始数据类型包括unsigned ch ...
- C#数字图像处理算法学习笔记(三)--图像几何变换
C#数字图像处理算法学习笔记(三)--图像几何变换 几何图像处理包括 图像的平移变换,镜像变换,旋转变换,伸缩变换,在这里仅以水平镜像为例,通过代码来理解其基本操作方式: 翻转前:
- Linux防火墙iptables学习笔记(三)iptables命令详解和举例[转载]
Linux防火墙iptables学习笔记(三)iptables命令详解和举例 2008-10-16 23:45:46 转载 网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能 ...
- C++Primer第5版学习笔记(三)
C++Primer第5版学习笔记(三) 第四/五章的重难点内容 你可以点击这里回顾第三章内容 因为第五章的内容比较少,因此和第四章的笔记内容合并. 第四章是 ...
随机推荐
- 数据安全刻不容缓,国产智能化厂商首获SOC 2鉴证报告有何意义?
数据安全刻不容缓,国产智能化厂商首获SOC 2鉴证报告有何意义? 了解SOC 2与ISO 27001的区别,你就知道SOC 2对智能自动化厂商的意义了 文/王吉伟 要问当前组织对于数字化转型的最大顾虑 ...
- pg distinct 改写递归优化(德哥的思路)
德哥的优化思路巨牛逼,这种递归思维真的太吊了,我目前就缺递归思路. 下面SQL1000W行数据,列的选择性很低,只有两个值('1'和'11')都是字符串类型,'1'只有一条数据,'11'有999999 ...
- 获取input[type="checkbox"]:checked 所在tr中特定元素
1.要求如下 2.html源码 <div class="btn"> <button type="button" onclick=" ...
- 我的电脑 属性 代理 win10 不用的时候记得关闭,git python node 等
- 逆向通达信Level-2 续三 (KTL python控制台动态调试)
python控制台逆向分析. python 跟 js 自如切换 逆向通达信Level-2 续十一 (无帐号登陆itrend研究版) 逆向通达信Level-2 续十 (trace脱壳) 逆向通达信Lev ...
- ubuntu切换root到user
目前知道: 从root用户切回user用户有三种方法: 1.su user (user是你自己安装时候的用户名) 2.直接输入exit 3.ctrl+D组合键
- C++4中cast类型强制转换方式
static_cast<type_id>(expr) 用于基本类型的转换,也可以将继承关系的对象指针或引用之间进行上下转型,但是在没有运行时类型检查的情况下,不保证类型安全. static ...
- 三维模型3DTile格式轻量化压缩在移动智能终端应用方面的重要性分析
三维模型3DTile格式轻量化压缩在移动智能终端应用方面的重要性分析 随着移动智能终端设备的不断发展和普及,如智能手机.平板电脑等,以及5G网络技术的推广应用,使得在这些设备上频繁使用三维地理空间数据 ...
- 忘记Mysql密码怎么办
1.打开常用的Mysql管理工具 2.这里只是用Navicat举个例子 3.打开mysql数据库 修改密码为123456 update user set authentication_string=p ...
- Scratch基础(一):安装和了解软件
Scratch基础(一):安装和了解软件 编写计算机程序代码的能力是当今社会读写能力的重要组成部分.当人们学习使用Scratch进行编码时,他们将学习解决问题,设计项目和交流思想的重要策略. 1.安装 ...