转载https://www.cnblogs.com/52fhy/p/5436673.html

Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定文件接收方将以什么形式、什么编码读取这个文件,这就是经常看到一些Asp网页点击的结果却是下载到的一个文件或一张图片的原因。

之前一直分不清楚post请求里Content-Type方式,如application/x-www-form-urlencodedmultipart/form-data。本文会介绍Content-Type有哪几种、插件Postman和RESTClient使用示例。文末还会介绍在PHP中CURL里需要注意的细节。

简介

Http Header里的Content-Type一般有这三种:
application/x-www-form-urlencoded:数据被编码为名称/值对。这是标准的编码格式。
multipart/form-data: 数据被编码为一条消息,页上的每个控件对应消息中的一个部分。
text/plain: 数据以纯文本形式(text/json/xml/html)进行编码,其中不含任何控件或格式字符。postman软件里标的是RAW。

form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencodedmultipart/form-data,默认为application/x-www-form-urlencoded

当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串追加到url后面,用?分割,加载这个新的url。

当action为post时候,浏览器把form数据封装到http body中,然后发送到server。 如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。 但是如果有type=file的话,就要用到multipart/form-data了。

当action为post且Content-Type类型是multipart/form-data,浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。

Postman使用示例及分析

Postman是一款功能强大的网页调试与发送网页HTTP请求的工具。

可以在这里下载。官网:https://www.getpostman.com/

这里要请求的是百度短网址的API。

生成短网址
请求:向http://dwz.cn/create.php发送post请求,发送数据包括url=长网址
返回:json格式的数据
status!=0 出错,查看err_msg获得错误信息(UTF-8编码)
成功,返回生成的短网址 tinyurl字段

1、使用application/x-www-form-urlencoded方式:

这种方式用的比较多。下面是发送预览:

实际发送的内容:

2、使用multipart/form-data方式:
这里也可以指定为multipart/form-data方式。

一般上传文件才会使用这种方式。下面是发送预览:

实际发送的内容:

3、使用text/plain方式:
一般向服务端发送json数据会使用这种方式。百度短网址API不支持这种方式,这里仅作演示。

实际发送的内容:

四种常见的 POST 提交数据方式对应的content-type取值

application/x-www-form-urlencoded

这应该是最常见的 POST 提交数据的方式了。浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。请求类似于下面这样(无关的请求头在本文中都省略掉了):

POST http://www.example.com HTTP/1.1 
Content-Type: application/x-www-form-urlencoded;charset=utf-8

title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3 
首先,Content-Type 被指定为 application/x-www-form-urlencoded;其次,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。大部分服务端语言都对这种方式有很好的支持。
很多时候,我们用 Ajax 提交数据时,也是使用这种方式。例如 JQuery 和 QWrap 的 Ajax,Content-Type 默认值都是「application/x-www-form-urlencoded;charset=utf-8」。

multipart/form-data

这又是一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让 form 的 enctyped 等于这个值。直接来看一个请求示例:

POST http://www.example.com HTTP/1.1 
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA

------WebKitFormBoundaryrGKCBY7qhFd3TrwA 
Content-Disposition: form-data; name="text"

title 
------WebKitFormBoundaryrGKCBY7qhFd3TrwA 
Content-Disposition: form-data; name="file"; filename="chrome.png" 
Content-Type: image/png

PNG ... content of chrome.png ... 
------WebKitFormBoundaryrGKCBY7qhFd3TrwA-- 
这个例子稍微复杂点。首先生成了一个 boundary 用于分割不同的字段,为了避免与正文内容重复,boundary 很长很复杂。然后 Content-Type 里指明了数据是以 mutipart/form-data 来编码,本次请求的 boundary 是什么内容。消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以 --boundary 开始,紧接着内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)。如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以 --boundary-- 标示结束。关于 mutipart/form-data 的详细定义,请前往 rfc1867 查看。

这种方式一般用来上传文件,各大服务端语言对它也有着良好的支持。

上面提到的这两种 POST 数据的方式,都是浏览器原生支持的,而且现阶段原生 form 表单也只支持这两种方式。但是随着越来越多的 Web 站点,尤其是 WebApp,全部使用 Ajax 进行数据交互之后,我们完全可以定义新的数据提交方式,给开发带来更多便利。

application/json

application/json 这个 Content-Type 作为响应头大家肯定不陌生。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。

JSON 格式支持比键值对复杂得多的结构化数据,这一点也很有用。记得我几年前做一个项目时,需要提交的数据层次非常深,我就是把数据 JSON 序列化之后来提交的。不过当时我是把 JSON 字符串作为 val,仍然放在键值对里,以 x-www-form-urlencoded 方式提交。

Google 的 AngularJS 中的 Ajax 功能,默认就是提交 JSON 字符串。例如下面这段代码:

var data = {'title':'test', 'sub' : [1,2,3]}; 
$http.post(url, data).success(function(result) { 
    ... 
}); 
最终发送的请求是:

POST http://www.example.com HTTP/1.1 
Content-Type: application/json;charset=utf-8

{"title":"test","sub":[1,2,3]} 
这种方案,可以方便的提交复杂的结构化数据,特别适合 RESTful 的接口。各大抓包工具如 Chrome 自带的开发者工具、Firebug、Fiddler,都会以树形结构展示 JSON 数据,非常友好。但也有些服务端语言还没有支持这种方式,例如 php 就无法通过 $_POST 对象从上面的请求中获得内容。这时候,需要自己动手处理下:在请求头中 Content-Type 为 application/json 时,从 php://input 里获得原始输入流,再 json_decode 成对象。一些 php 框架已经开始这么做了。

当然 AngularJS 也可以配置为使用 x-www-form-urlencoded 方式提交数据。如有需要,可以参考这篇文章。

text/xml

我的博客之前提到过 XML-RPC(XML Remote Procedure Call)。它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。典型的 XML-RPC 请求是这样的:

POST http://www.example.com HTTP/1.1 
Content-Type: text/xml

<!--?xml version="1.0"?--> 
<methodcall> 
    <methodname>examples.getStateName</methodname> 
    <params> 
        <param> 
            <value><i4>41</i4></value> 
         
    </params> 
</methodcall> 
XML-RPC 协议简单、功能够用,各种语言的实现都有。它的使用也很广泛,如 WordPress 的 XML-RPC Api,搜索引擎的 ping 服务等等。JavaScript 中,也有现成的库支持以这种方式进行数据交互,能很好的支持已有的 XML-RPC 服务。不过,我个人觉得 XML 结构还是过于臃肿,一般场景用 JSON 会更灵活方便。

Http Header里的Content-Type相关推荐

  1. 用VS向SharePoint中部署添加List 并指定应用的Content Type

    在SharePoint Project中添加相应的Item,完全用界面的形式向EricSunArticlesList中添加好对应的Column,之后用Feature将List添加到SharePoint ...

  2. sendData to ABAP backend via multiple form content type

    Created by Jerry Wang, last modified on Aug 20, 2014 使用multipart/form-data的content type通过Javascript向 ...

  3. 阿里云存储OSS中设置上传文件content type

    阿里云存储OSS中设置上传文件ContentType 如果你使用浏览器上传文件,则浏览器会自动在header中设置正确地content type,然后对文件的访问会得到正确地回应. 如果采用编程的方式 ...

  4. Sharepoint学习笔记—Site Definition系列-- 2、创建Content Type

    Sharepoint本身就是一个丰富的大容器,里面存储的所有信息我们可以称其为"内容(Content)",为了便于管理这些Conent,按照人类的正常逻辑就必然想到的是对此进行&q ...

  5. java httpresponse headres属性,Http Header里的Content-Type - 飞鸿影~ - 博客园

    之前一直分不清楚post请求里Content-Type方式,如 application/x-www-form-urlencoded . multipart/form-data .本文会介绍Conten ...

  6. SharePoint2010 内容类型剖析(Content Type/ 內容類型)

    原文地址:http://sharepoint410.wordpress.com/2011/01/06/sharepoint2010-%E5%86%85%E5%AE%B9%E7%B1%BB%E5%9E% ...

  7. 报错Content type ‘multipart/form-data;boundary=----WebKitFormBoundaryTz0sivpVO7U0H70m;charset=UTF-8‘ n

    最近在做一个图片上传,遇到这了这种情况,在入参 body 中同时传入文件和其它参数信息结果出现如题异常. 特别在此记录解决办法,以供大家参考. method="post"必须事po ...

  8. beforeSend 出现跨域问题,header里直接设置token就没问题----Day1

    一开始前端调用后端接口出现跨域问题,右键查看元素,会有跨域错误提示,类似下图,后来找后端设置了一下,问题解决.可以登录获取token等参数了. 但是 请求设备列表时,beforeSend 中设置tok ...

  9. 苹果微信推送服务器错误,接入WxPusher微信推送服务出现错误:Content type application/x...

    背景 使用WxPusher微信推送服务 ,可以及时的将服务的一些运行异常信息,发送到自己的微信上,方便了解服务的运行状态(PS:这个服务是免费的). 你可以在这里看到WxPusher微信推送服务的接入 ...

最新文章

  1. android res文件夹下面的 values-v11 、 values-v14
  2. 配置CNPM-基础案例
  3. oracle解锁用户实例,在Oracle 11G R2里启用示例帐户scott
  4. 电商促销插画风PSD分层模板,直击底价!吸睛容情!
  5. boss 计算机应用,Time Boss(电脑使用时间限制软件)官方版
  6. php钩子配置,thinkphp 行为扩展 钩子与插件的实现
  7. Python 和 C++实现 九九乘法表
  8. 【基础教程】信噪比+香农公式【1748期】
  9. 黑马程序员Java教程学习笔记(一)
  10. 阿里云Flink SQL开发指南——字符串函数——REGEXP_REPLACE正则替换
  11. 错误 D8016 “/ZI”和“/GL”命令行选项不兼容
  12. PowerWeChat 微信SDK 介绍
  13. python Plot 画图用法
  14. 流利阅读12.17 Why are the 'yellow vests' still protesting in France? His name is Macron
  15. 宝存科技推出全球首款大量商用级别的高性能Open-Channel SSD
  16. oracle让电脑变卡以及解决方法
  17. python中一元二次方程的虚根_一元二次方程的概念和习题(老师用)
  18. 【论文】如何记论文笔记
  19. java注册数据库驱动
  20. 传奇修改服务器开区天数,新手开区简单的修改说明

热门文章

  1. 上海市重点小学排名(2018年)
  2. T检验,方差分析,非参数检验,卡方检验,方差分析总结
  3. Firebase 远程配置 iOS 教程
  4. Leetcode160. 相交链表
  5. html+css(锚点的使用)
  6. qt QGraphicsItem自绘鼠标形状
  7. 做自媒体进行文章查重的工具哪个好?操作方便快捷吗?
  8. 基于DeepFace模型设计的人脸识别软件
  9. flex布局属性的伸展、收缩、基准属性
  10. QT .exe crashed 报错解决思路