Content-Type(内容类型),一般指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这也是一些网页点击的结果却是一个文件或一张图片的原因。

Content-Type 是请求报文和响应报文的实体部分使用的头部,标识实际返回实体主体的媒体类型。

语法:

Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something

常见的媒体格式类型如下:

  • text/html : HTML格式
  • text/plain :纯文本格式
  • text/xml : XML格式
  • image/gif :gif图片格式
  • image/jpeg :jpg图片格式
  • image/png:png图片格式

以application开头的媒体格式类型:

  • application/xhtml+xml :XHTML格式
  • application/xml: XML数据格式
  • application/atom+xml :Atom XML聚合格式
  • application/json: JSON数据格式
  • application/pdf:pdf格式
  • application/msword : Word文档格式
  • application/octet-stream : 二进制流数据(如常见的文件下载)
  • application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

另外一种常见的媒体格式是上传文件之时使用的:

  • multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

POST提交数据的方式

  1、application/x-www-form-urlencoded

    在发送到服务器前,使用URL的percent-encoding(百分号编码)编码所有的字符。

    之所以叫百分号编码,是因为它的编码方式非常简单,使用%加上两位的字符(012345678ABCDEF)代表一个字节的十六进制形式。URL 编码默认使用的字符集是US-ASCII。例如a在US-ASCII码中对应的字节是0x61,那么URL编码后得到的就是%61。

    如保留字符的URL编码

! * " ' ( ) ; : @ & = + $ , / ? % # [ ]
%21 %2A %22 %27 %28 %29 %3B %3A %40 %26 %3D %2B %24 %2C %2F %3F %25 %23 %5B %5D

    这也是最常见的POST|提交方式,浏览器的原生<form>表单,如果不设置enctype属性,那么最终会以application/x-www-form-urlencoded 方式提交数据。

    URL编码详情见本文附录。

  例如 JQuery 和 QWrap 的 Ajax,Content-Type 默认值都是「application/x-www-form-urlencoded;charset=utf-8」

  使用这种方式,抓包看到的请求是这样的:

POST http://xxx/query.json HTTP/1.1
Host: xxx
Connection: keep-alive
Content-Length: 294
Accept: */*
Origin: xxx
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: xxx
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: JSESSIONID=aaa1xsjvLKCZC-beX0-1w sEcho=1&iColumns=7&sColumns=&iDisplayStart=0&iDisplayLength=10&mDataProp_0=id&mDataProp_1=schemeId&mDataProp_2=redeemNo&mDataProp_3=redeemCode&mDataProp_4=function&mDataProp_5=function&mDataProp_6=function&schemeId=160425SCH1461578754536&num=&comment=&source=&expiretime=&attachmentName=&state=

  请求参数是key/value的形式,并以&符拼接在一起,但是不会在请求URL中显示。

  2、multipart/form-data

  我们使用表单上传文件时,必须设置 <form> 表单的enctype属性 等于 multipart/form-data。

  使用这种方式,抓包看到的请求是这样的:

POST http://xxx HTTP/1.1
Host: xxx
Connection: keep-alive
Content-Length: 356
Accept: application/json, text/javascript, */*; q=0.01
Origin: xxx
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary5SBLMDU5DZ2Hmqej
Referer: xxx
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: JSESSIONID=aaa1xsjvLKCZC-beX0-1w ------WebKitFormBoundary5SBLMDU5DZ2Hmqej
Content-Disposition: form-data; name="file"; filename="xxx.sql"
Content-Type: application/octet-stream use xxx;
insert into xxx;
------WebKitFormBoundary5SBLMDU5DZ2Hmqej--

  3、application/json  (推荐使用)

  用来告知服务器消息主体(body)是序列化后的JSON字符串。使用此种方式需要解析request中的body获取请求数据。

  使用Spring的话用@RequestBody注解来解析请求参数,这个注解说明参数是从HTTP的body中去获取。

  使用这种方式,抓包看到的请求是这样的:

POST http://xxx HTTP/1.1
Host: xxx
Connection: keep-alive
Content-Length: 160
Accept: application/json, text/javascript, */*; q=0.01
Origin: xxx
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36
Content-Type: application/json
Referer: xxx
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: JSESSIONID=aaa1xsjvLKCZC-beX0-1w {"schemeId":"160425SCH1461578754536","attachmentName":"xxx.sql","num":"30","comment":"test","expiretime":"2019-09-01"}

  4、text/xml

  XML-RPC(XML Remote Procedure Call,它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范

  不过这种方式暂时没有用过。

附录:

  URL编码与解码

  对于URL来说,编码是为了消除歧义。如POST使用Content-Type:application/x-www-form-urlencoded 方式提交数据时,URL参数字符串之间使用【key=value&key=value】的形式来传输,键值之间以&符拼接和分割,那么如果参数名key或者参数值value中包含了=或者&符号势必会造成接收URL的服务器解析错误,因此必须对引起歧义的符号进行转义,也就是编码。

  URL的编码格式采用ASCII码,也就是说,不能在URL中包含任何非ASCII字符,例如中文。

  RFC3986文档规定,URL中只允许包含英文字母(a-zA-Z)、数字、-_.~ 4个特殊字符以及所有保留字符。URL编码中的10-7F字节全部都表示控制字符,这些字符都不能放在URL中。

  RFC3986中指定了以下字符为保留字符:! * ' ( ) ; : @ & = + $ , / ? # [ ]

  不安全字符:还有一些字符,当他们直接放在Url中的时候,可能会引起解析程序的歧义。这些字符被视为不安全字符,原因有很多。

    空格:Url在传输的过程,或者用户在排版的过程,或者文本处理程序在处理Url的过程,都有可能引入无关紧要的空格,或者将那些有意义的空格给去掉。
    引号以及<>:引号和尖括号通常用于在普通文本中起到分隔Url的作用
    #:通常用于表示书签或者锚点
    %:百分号本身用作对不安全字符进行编码时使用的特殊字符,因此本身需要编码
    {}|\^[]`~:某一些网关或者传输代理会篡改这些字符

  需要注意的是,对于Url中的合法字符,编码和不编码是等价的。

如何对Url中的非法字符进行编码

  URL编码也叫percent-encoding(百分号编码),之所以叫百分号编码,是因为它的编码方式非常简单,使用%加上两位的字符(012345678ABCDEF)代表一个字节的十六进制形式。URL 编码默认使用的字符集是US-ASCII。例如a在US-ASCII码中对应的字节是0x61,那么URL编码后得到的就是%61。我们在地址栏上输入http://g.cn/search?q=%61%62%63,实际上就等同于在google上搜索abc了。又如@符号在ASCII字符集中对应的字节为0x40,经过Url编码之后得到的是%40。

  对于非ASCII字符,需要使用ASCII字符集的超集进行编码得到相应的字节,然后对每个字节执行百分号编码。对于Unicode字符,RFC文档建议使用utf-8对其进行编码得到相应的字节,然后对每个字节执行百分号编码。如"中文"使用UTF-8字符集得到的字节为0xE4 0xB8 0xAD 0xE6 0x96 0x87,经过Url编码之后得到"%E4%B8%AD%E6%96%87"。

HTTP content-type及POST提交数据方式的更多相关文章

  1. (转)四种常见的 POST 提交数据方式

    四种常见的 POST 提交数据方式(转自:https://imququ.com/post/four-ways-to-post-data-in-http.html) HTTP/1.1 协议规定的 HTT ...

  2. C# HttpWebRequest提交数据方式浅析

    C# HttpWebRequest提交数据方式学习之前我们先来看看什么是HttpWebRequest,它是 .net 基类库中的一个类,在命名空间 System.Net 下面,用来使用户通过HTTP协 ...

  3. 四种常见的 POST 提交数据方式(application/x-www-form-urlencoded,multipart/form-data,application/json,text/xml)

    四种常见的 POST 提交数据方式(application/x-www-form-urlencoded,multipart/form-data,application/json,text/xml) 转 ...

  4. application/json 四种常见的 POST 提交数据方式

    四种常见的 POST 提交数据方式   HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 ...

  5. 转:application/json 四种常见的 POST 提交数据方式

    四种常见的 POST 提交数据方式 HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 PO ...

  6. 【转】C# HttpWebRequest提交数据方式

    [转]C# HttpWebRequest提交数据方式 HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数据的最好选择.它们支持一系列有用的属性.这两个类位 于Sy ...

  7. 四种常见的 POST 提交数据方式--good

    HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据,本文 ...

  8. 四种常见的 POST 提交数据方式 专题

    定义和用法 enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码.默认地,表单数据会编码为 "application/x-www-form-urlencoded". ...

  9. 【http】四种常见的 POST 提交数据方式

    来源:http://www.cnblogs.com/aaronjs/p/4165049.html HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT ...

  10. 四种常见的 POST 提交数据方式

    HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 这几种.其中 POST 一般用来向服务端提交数据,本文 ...

随机推荐

  1. robotframework之常用系统关键字

    常用系统关键字此处做些记录,后续根据实际应用陆续补充 1.变量声明 ${a} Set Variable hello 2.表单嵌套 Select Frame Xpath=//* [@] Unselect ...

  2. 移动端自动化==>Windows-Android-Appium环境搭建

    第一步 安装JDK,本机如果带有1.7及以上版本且配置好了环境变量,则可忽略此安装步骤. JDK的安装包,百度下载即可.安装完成后配置环境变量. cmd下验证环境变量是否配置成功 第二步 安装Andr ...

  3. 2019暑假第二周(hadoop在个人电脑上的搭建)

    一,Hadoop和NoSQL数据库的学习,大多需要Linux环境. 搭建Linux环境可以分为两种方式: (1)在电脑上安装双操作系统,即同时安装Linux和Windows操作系统,在电脑启动的时候, ...

  4. JMeter常用的4种参数化方式-操作解析

    目录结构 一.JMeter参数化简介 1.JMeter参数化的概念 2.JMeter参数化方式之使用场景对比 二.JMeter参数化的4种主要方式-操作演练 1.User Parameters(用户参 ...

  5. jmeter线程组基本设置

    线程组基本设置 在线程组界面中可以设置以下数据,进行控制线程组: 1.取样器错误后要执行的动作: 继续:忽略错误,继续执行 Start Next Thread Loop: 忽略错误,线程当前循环终止, ...

  6. 【Qt开发】解决Qt程序在Linux下无法输入中文的办法

    解决Qt程序在Linux下无法输入中文的办法 一位网友问我如何在Linux的Qt的应用程序中输入中文,我一开始觉得不是什么问题,但是后面自己尝试了一下还真不行.不仅是Qt制作的应用程序,就连Qt Cr ...

  7. 20191127 Spring Boot官方文档学习(6-8)

    6.部署Spring Boot应用程序 在部署应用程序时,Spring Boot的灵活打包选项提供了很多选择.您可以将Spring Boot应用程序部署到各种云平台,容器映像(例如Docker)或虚拟 ...

  8. mysql驱动表与被驱动表及join优化

    驱动表与被驱动表 先了解在join连接时哪个表是驱动表,哪个表是被驱动表:1.当使用left join时,左表是驱动表,右表是被驱动表2.当使用right join时,右表时驱动表,左表是驱动表3.当 ...

  9. python 并发编程 多进程 Process对象的其他属性方法 join 方法

    一 Process对象的join方法 在主进程运行过程中如果想并发地执行其他的任务,我们可以开启子进程,此时主进程的任务与子进程的任务分两种情况 情况一: 在主进程的任务与子进程的任务彼此独立的情况下 ...

  10. Linux cd命令(4)

    可以说在Linux上的一切操作都是从 cd 命令开始的.cd 是change directory的简写,其作用就是更改当前工作目录. 使用cd 对于这个命令的使用,不用多说了.需要注意的两点就是: c ...