HTTP报文是什么样的?
目录
什么是 HTTP 协议?
HTTP的报文结构
HTTP请求报文
GET请求报文
POST请求报文
HTTP响应报文
什么是 HTTP 协议?
全称:hypertext transfer protocol(超文本传输协议),是 TCP/IP 协议族的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。
通俗的讲,当客户端或者浏览器连接上服务器之后,若想获得 web 服务器中的 web 资源,就必须与 服务端进行通信,通信的双方必须能够解析发送的消息,那么这个消息就要符合一定的通讯格式,HTTP 就是用于定义双方的通信格式。
HTTP的报文结构
http的请求报文和响应报文的格式基本一样,主要分为三部分:
- 起始行(start line): 描述请求或响应的状态
- 头部字段(header): 以 key:value 的形式展示
- 数据实体(entity/ body) :实际要传输的数据,可以是文本,也可以是图片、文件、视频等二进制数据
其中 "起始行" 和 "头部字段" 又一起被称为 “请求头” 或 “响应头” ,消息正文又被称为 “实体(entity)” 或者 与 “header” 相对应的 “body” 。 请求头和响应头与 “body” 中间有一个空行(CRLF)作为区分两者的边界,记住是第一个空行(CRLF),如果有多个空行,那么其他的空行则被归为“body”。所以一个完整的报文如下图所示(图是盗来的(#^.^#)):
HTTP请求报文
GET请求报文
我们先来看下一个普通的GET请求,它的报文结构是什么样的:
GET /books/java.html HTTP/1.1 ---请求行(如果有带参数,会拼接在URL)
-------------------------------------------------------
Accept: */* ---header
Accept-Language: en-us
Connection: Keep-Alive
Host: localhost
Referer: http://localhost/links.asp
User-Agent: Mozilla/4.0
Accept-Encoding: gzip, deflate
-------------------------------------------------------
---空白行
--body(这里没有内容)
“虚线” 是我为了清楚将三部分分开加上去的,实际请求是没有的。 我们照着HTTP报文结构来看下GET请求的报文:
1. 起始行
GET /books/java.html HTTP/1.1
起始行包括三个部分 请求方式(GET)+ 请求的资源在服务器中的相对路径(URI) + HTTP的版本 ,所以该起始行表示的是,使用HTTP 1.1 版本协议的标准,用GET请求方式,请求 目标服务器 “/books/java.html” 路径下的资源,至于目标服务器的IP地址和端口号呢,这个参数就在header中,“Host: localhost” ,所以请求的服务器完整地址是 http://locallhost:8080/books/java.html 因为我是在本地的tomcat服务器上访问的,所以ip地址是localhost,相当于平常看到的192.168.3.56 这种地址。
2. header
header中既有固定的参数字段(属于HTTP协议),也可以根据自己的需求添加。我们来看下
Accept: */* -- 可接收的数据类型
Accept-Language: en-us -- 支持的语言设置
Connection: Keep-Alive -- 保持连接
Host: localhost -- 请求的资源所在的地址
Referer: http://localhost/links.asp --表示从哪个页面发起请求
User-Agent: Mozilla/4.0 -- 发起请求的浏览器名和版本号
Accept-Encoding: gzip, deflate --支持的编解码格式
Host 字段只能出现在请求头中,而且是必须出现的,否则就是一个错误的报文。Host 字段告诉服务器这个请求应该由哪个主机来处理,当一台计算机上托管了多个虚拟主机的时候,服务器端就需要用 Host 字段来选择。
更多的header参数,详见:常用的HTTP请求头与响应头
3. body
GET 请求是没有“body”这部分参数的,GET 请求如果带有参数,参数会直接拼接在 start line 的第二个参数后面,用 "?" 隔开,以key=value的形式添加参数,参数与参数之间用 "&" 隔开。如:
GET /books/java.html?name=shonn&password=123456 HTTP/1.1
POST请求报文
1、发送纯文本的参数
POST /foo.php HTTP/1.1
---------------------------------------------------------------------------------
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5)Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost/test.php
Content-Type: application/x-www-form-urlencoded ---GET请求没有这个
Content-Length: 43
---------------------------------------------------------------------------------
first_name=John&last_name=Doe&action=Submit -----内容实体
2、发送文本参数和文件
POST /hello/checkUser.html?opt=xxx HTTP/1.1
Accept: */*
Referer: http://localhost:8000/hello/index.html
Accept-Language: zh-cn
Content-Type: multipart/form-data; boundary=---------------------------7d931c5d043e
Accept-Encoding: gzip, deflate
Host: localhost:8000
Content-Length: 382
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: JSESSIONID=6FE3D8E365DF9FE26221A32624470D24
-----------------------------7d931c5d043e
Content-Disposition: form-data; name="username"
zxy
-----------------------------7d931c5d043e
Content-Disposition: form-data; name="age"
25
-----------------------------7d931c5d043e
Content-Disposition: form-data; name="file"; filename="C:/111.txt"
Content-Type: text/plain
hello
-----------------------------7d931c5d043e--
POST请求和GET请求报文上的区别,主要在于POST请求参数是放在 “body” 中。
“Content-Type” 表示请求体的MIME类型,通俗的讲就是表示发送的数据的格式,“Content-Length” 表示的是数据的长度。常用的 Content-Type :
(1)application/x-www-form-urlencoded:窗体数据被编码为名称/值对。这是标准的编码格式,为默认的方式。
(2)multipart/form-data:窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。二进制数据传输方式,该格式会生成一个
boundary
字符串来分割不同的参数,格式为:boundary=--${boundary},一般是以两个开头,添加到header的Content-Type中,如 Content-Type: multipart/form-data; boundary=---------------------------7d931c5d043e
multipart/form-data 经常用来传送参数和文件混合的数据,Content-Disposition的格式为:
Content-Disposition: “disposition-type” *( ";" disposition-parm )
Content-Disposition为属性名,disposition-type是以什么方式下载,如
- "attachment" 表示以附件方式下载
- "inline" 用网页打开,
- "form-data" 文件上传使用
*( ";" disposition-parm ) 表示可带有多个参数,用分号隔开
例如:上传普通参数:Content-Disposition: form-data; name="username"
上传文件:Content-Disposition: form-data; name="file"; filename="C:/1.mp4"
- name:上传的参数名
- filename:上传的文件名,可以是绝对路径也可以只是文件名,如果文件名为中文,要先进行编码,例如fileName = new String(fileName.getBytes(), "UTF-8");
(3)text/plain:窗体数据以纯文本形式进行编码,经常在参数后加上Charset表示文本内容的编码,如:Content-Type: text/plain;Charset=UTF-8 ,其中不含任何控件或格式字符。
附:HTTP MIME类型即ContentType属性值列表
MIME-Typ |
Dateiendung(en) |
Bedeutung |
application/acad |
*.dwg |
AutoCAD-Dateien (nach NCSA) |
application/applefile |
AppleFile-Dateien |
|
application/astound |
*.asd *.asn |
Astound-Dateien |
application/dsptype |
*.tsp |
TSP-Dateien |
application/dxf |
*.dxf |
AutoCAD-Dateien (nach CERN) |
application/futuresplash |
*.spl |
Flash Futuresplash-Dateien |
application/gzip |
*.gz |
GNU Zip-Dateien |
application/listenup |
*.ptlk |
Listenup-Dateien |
application/mac-binhex40 |
*.hqx |
Macintosh Binärdateien |
application/mbedlet |
*.mbd |
Mbedlet-Dateien |
application/mif |
*.mif |
FrameMaker Interchange Format Dateien |
application/msexcel |
*.xls *.xla |
Microsoft Excel Dateien |
application/mshelp |
*.hlp *.chm |
Microsoft Windows Hilfe Dateien |
application/mspowerpoint |
*.ppt *.ppz *.pps *.pot |
Microsoft Powerpoint Dateien |
application/msword |
*.doc *.dot |
Microsoft Word Dateien |
application/octet-stream |
*.bin *.exe *.com *.dll *.class |
Ausführbare Dateien |
application/oda |
*.oda |
Oda-Dateien |
application/pdf |
|
Adobe PDF-Dateien |
application/postscript |
*.ai *.eps *.ps |
Adobe PostScript-Dateien |
application/rtc |
*.rtc |
RTC-Dateien |
application/rtf |
*.rtf |
Microsoft RTF-Dateien |
application/studiom |
*.smp |
Studiom-Dateien |
application/toolbook |
*.tbk |
Toolbook-Dateien |
application/vocaltec-media-desc |
*.vmd |
Vocaltec Mediadesc-Dateien |
application/vocaltec-media-file |
*.vmf |
Vocaltec Media-Dateien |
application/xhtml+xml |
*.htm *.html *.shtml *.xhtml |
XHTML-Dateien |
application/xml |
*.xml |
XML-Dateien |
application/x-bcpio |
*.bcpio |
BCPIO-Dateien |
application/x-compress |
*.z |
zlib-komprimierte Dateien |
application/x-cpio |
*.cpio |
CPIO-Dateien |
application/x-csh |
*.csh |
C-Shellscript-Dateien |
application/x-director |
*.dcr *.dir *.dxr |
Macromedia Director-Dateien |
application/x-dvi |
*.dvi |
DVI-Dateien |
application/x-envoy |
*.evy |
Envoy-Dateien |
application/x-gtar |
*.gtar |
GNU tar-Archivdateien |
application/x-hdf |
*.hdf |
HDF-Dateien |
application/x-httpd-php |
*.php *.phtml |
PHP-Dateien |
application/x-javascript |
*.js |
serverseitige JavaScript-Dateien |
application/x-latex |
*.latex |
LaTeX-Quelldateien |
application/x-macbinary |
*.bin |
Macintosh Binärdateien |
application/x-mif |
*.mif |
FrameMaker Interchange Format Dateien |
application/x-netcdf |
*.nc *.cdf |
Unidata CDF-Dateien |
application/x-nschat |
*.nsc |
NS Chat-Dateien |
application/x-sh |
*.sh |
Bourne Shellscript-Dateien |
application/x-shar |
*.shar |
Shell-Archivdateien |
application/x-shockwave-flash |
*.swf *.cab |
Flash Shockwave-Dateien |
application/x-sprite |
*.spr *.sprite |
Sprite-Dateien |
application/x-stuffit |
*.sit |
Stuffit-Dateien |
application/x-supercard |
*.sca |
Supercard-Dateien |
application/x-sv4cpio |
*.sv4cpio |
CPIO-Dateien |
application/x-sv4crc |
*.sv4crc |
CPIO-Dateien mit CRC |
application/x-tar |
*.tar |
tar-Archivdateien |
application/x-tcl |
*.tcl |
TCL Scriptdateien |
application/x-tex |
*.tex |
TeX-Dateien |
application/x-texinfo |
*.texinfo *.texi |
Texinfo-Dateien |
application/x-troff |
*.t *.tr *.roff |
TROFF-Dateien (Unix) |
application/x-troff-man |
*.man *.troff |
TROFF-Dateien mit MAN-Makros (Unix) |
application/x-troff-me |
*.me *.troff |
TROFF-Dateien mit ME-Makros (Unix) |
application/x-troff-ms |
*.me *.troff |
TROFF-Dateien mit MS-Makros (Unix) |
application/x-ustar |
*.ustar |
tar-Archivdateien (Posix) |
application/x-wais-source |
*.src |
WAIS Quelldateien |
application/x-www-form-urlencoded |
HTML-Formulardaten an CGI |
|
application/zip |
*.zip |
ZIP-Archivdateien |
audio/basic |
*.au *.snd |
Sound-Dateien |
audio/echospeech |
*.es |
Echospeed-Dateien |
audio/tsplayer |
*.tsi |
TS-Player-Dateien |
audio/voxware |
*.vox |
Vox-Dateien |
audio/x-aiff |
*.aif *.aiff *.aifc |
AIFF-Sound-Dateien |
audio/x-dspeeh |
*.dus *.cht |
Sprachdateien |
audio/x-midi |
*.mid *.midi |
MIDI-Dateien |
audio/x-mpeg |
*.mp2 |
MPEG-Dateien |
audio/x-pn-realaudio |
*.ram *.ra |
RealAudio-Dateien |
audio/x-pn-realaudio-plugin |
*.rpm |
RealAudio-Plugin-Dateien |
audio/x-qt-stream |
*.stream |
Quicktime-Streaming-Dateien |
audio/x-wav |
*.wav |
WAV-Dateien |
drawing/x-dwf |
*.dwf |
Drawing-Dateien |
image/cis-cod |
*.cod |
CIS-Cod-Dateien |
image/cmu-raster |
*.ras |
CMU-Raster-Dateien |
image/fif |
*.fif |
FIF-Dateien |
image/gif |
*.gif |
GIF-Dateien |
image/ief |
*.ief |
IEF-Dateien |
image/jpeg |
*.jpeg *.jpg *.jpe |
JPEG-Dateien |
image/png |
*.png |
PNG-Dateien |
image/tiff |
*.tiff *.tif |
TIFF-Dateien |
image/vasa |
*.mcf |
Vasa-Dateien |
image/vnd.wap.wbmp |
*.wbmp |
Bitmap-Dateien (WAP) |
image/x-freehand |
*.fh4 *.fh5 *.fhc |
Freehand-Dateien |
image/x-icon |
*.ico |
Icon-Dateien (z.B. Favoriten-Icons) |
image/x-portable-anymap |
*.pnm |
PBM Anymap Dateien |
image/x-portable-bitmap |
*.pbm |
PBM Bitmap Dateien |
image/x-portable-graymap |
*.pgm |
PBM Graymap Dateien |
image/x-portable-pixmap |
*.ppm |
PBM Pixmap Dateien |
image/x-rgb |
*.rgb |
RGB-Dateien |
image/x-windowdump |
*.xwd |
X-Windows Dump |
image/x-xbitmap |
*.xbm |
XBM-Dateien |
image/x-xpixmap |
*.xpm |
XPM-Dateien |
message/external-body |
Nachricht mit externem Inhalt |
|
message/http |
HTTP-Headernachricht |
|
message/news |
Newsgroup-Nachricht |
|
message/partial |
Nachricht mit Teilinhalt |
|
message/rfc822 |
Nachricht nach RFC 2822 |
|
model/vrml |
*.wrl |
Visualisierung virtueller Welten (VRML) |
multipart/alternative |
mehrteilige Daten gemischt |
|
multipart/byteranges |
mehrteilige Daten mit Byte-Angaben |
|
multipart/digest |
mehrteilige Daten / Auswahl |
|
multipart/encrypted |
mehrteilige Daten verschlüsselt |
|
multipart/form-data |
mehrteilige Daten aus HTML-Formular (z.B. File-Upload) |
|
multipart/mixed |
mehrteilige Daten gemischt |
|
multipart/parallel |
mehrteilige Daten parallel |
|
multipart/related |
mehrteilige Daten / verbunden |
|
multipart/report |
mehrteilige Daten / Bericht |
|
multipart/signed |
mehrteilige Daten / bezeichnet |
|
multipart/voice-message |
mehrteilige Daten / Sprachnachricht |
|
text/comma-separated-values |
*.csv |
kommaseparierte Datendateien |
text/css |
*.css |
CSS Stylesheet-Dateien |
text/html |
*.htm *.html *.shtml |
HTML-Dateien |
text/javascript |
*.js |
JavaScript-Dateien |
text/plain |
*.txt |
reine Textdateien |
text/richtext |
*.rtx |
Richtext-Dateien |
text/rtf |
*.rtf |
Microsoft RTF-Dateien |
text/tab-separated-values |
*.tsv |
tabulator-separierte Datendateien |
text/vnd.wap.wml |
*.wml |
WML-Dateien (WAP) |
application/vnd.wap.wmlc |
*.wmlc |
WMLC-Dateien (WAP) |
text/vnd.wap.wmlscript |
*.wmls |
WML-Scriptdateien (WAP) |
application/vnd.wap.wmlscriptc |
*.wmlsc |
WML-Script-C-dateien (WAP) |
text/xml |
*.xml |
XML-Dateien |
text/xml-external-parsed-entity |
extern geparste XML-Dateien |
|
text/x-setext |
*.etx |
SeText-Dateien |
text/x-sgml |
*.sgm *.sgml |
SGML-Dateien |
text/x-speech |
*.talk *.spc |
Speech-Dateien |
video/mpeg |
*.mpeg *.mpg *.mpe |
MPEG-Dateien |
video/quicktime |
*.qt *.mov |
Quicktime-Dateien |
video/vnd.vivo |
*.viv *.vivo |
Vivo-Dateien |
video/x-msvideo |
*.avi |
Microsoft AVI-Dateien |
video/x-sgi-movie |
*.movie |
Movie-Dateien |
workbook/formulaone |
*.vts *.vtts |
FormulaOne-Dateien |
x-world/x-3dmf |
*.3dmf *.3dm *.qd3d *.qd3 |
3DMF-Dateien |
x-world/x-vrml |
*.wrl |
Visualisierung virtueller Welten (VRML) (veralteter MIME-Typ, aktuell ist model/vrml) |
HTTP响应报文
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 27 Dec 2019 01:43:32 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,PATCH
Access-Control-Max-Age: 3600
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept,token,userId,version{"code":0,"msg":"成功","resultData":.......}
HTTP响应报文的格式和请求报文的格式基本是一样的,只在 “start line” 上有所区别。响应报文的 “start line” 也是由三部分组成:
- 版本号:表示报文使用的http版本
- 状态码:一个三位数,表示本次请求的处理结果,如200表示请求成功
- 状态码的解释(原因):对请求结果加以说明,方便理解
HTTP/1.1 200 OK
该状态行表示 “本次请求处理完成,这个报文使用的http协议版本是1.1,状态码是200,一切ok”。
状态码列表:
状态码 |
含义 |
100~199 |
表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程 |
200~299 |
表示成功接收请求并已完成整个处理过程,常用200 |
300~399 |
为完成请求,客户需进一步细化请求。例如,请求的资源已经移动一个新地址,常用302、307和304 |
400~499 |
客户端的请求有错误,常用404 |
500~599 |
服务器端出现错误,常用 500 |
HTTP报文是什么样的?相关推荐
- 利用dom4j将实体类转换为对应的xml报文
利用dom4j生成xml报文 目标格式: <?xml version="1.0" encoding="GBK"?><Packet type=& ...
- java 报文长度计算_从TcpClient.GetStream()读取而不知道长度 - java
我正在研究基于TCP的通信协议.我所知 有很多方法可以确定何时结束阅读. 在消息末尾关闭连接 将消息的长度放在数据本身之前 使用分隔符:一些在正常数据中永远不会出现的值(或者总会以某种方式转义) 通常 ...
- mqtt session保持 订阅消息_如何使用 MQTT 报文实现发布订阅功能
MQTT 协议通过交换预定义的MQTT控制报文来通信.下面以 Connect 连接 MQTT 协议基于 TCP/IP 协议,MQTT Broker 和 Client 都有需要有 TCP/IP 地址. ...
- SIP协议的传输层原理报文解析(解读rfc3581)(待排版)
关于rfc3581/rport参数的阐述 一:简述 一般情况下,服务器在接收到request后,应答发向哪里呢?服务器在计算回应应答的算法是一种混合模式,具体说来是这样的: 1,IP:从哪里接收到的就 ...
- 报文如何截取时间_5种报文、8种邻居状态机详解OSPF工作原理
上一章节介绍了OSPF相比RIP具有无环路.路由收敛速度快.可扩展性好的特点.知识卡片 | 链路状态路由协议OSPF凭什么会取代RIP? 我们知道路由协议的最终目的是为了计算最优路由加入路由表来指导I ...
- dhcp报文_动态地址分配DHCP,IP地址管理方式及分配原则,一分钟了解下
一.DHCP简介 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)用来为网络设备动态地分配 IP 地址等网络配置参数. DHCP 采用客户端/服务器 ...
- http协议进阶(三)http报文
一.报文流 http报文是在http应用程序之间发送的数据块(也可称为数据包).这些数据块以一些文本的元信息(meta-information)开头,描述了报文的内容及含义,后面跟着 可选的数据部分, ...
- h3c 3600 acl 配置 滤源IP是网关的ARP报文的ACL规则
h3c 3600 acl 配置 滤源IP是网关的ARP报文的ACL规则 悬赏分:100 - 解决时间:2009-3-8 14:30 星号之间是我在网上查到的华为交换机的配置方法: ********** ...
- 如何突破DNS报文的512字节限制
"DNS协议大家都应该很熟悉,最近有同学问到如何获得UDP承载的超过512字节的DNS报文,借此机会,我们一起了解下DNS协议与报文长度有关的一些细节." 本文将讨论的是DNS协议 ...
- 读书笔记:《图解HTTP》第三章 HTTP报文
原文地址 博客积累地址 HTTP报文的作用 HTTP报文时是HTTP进行请求和响应时用来交换信息的,可以理解它为搬东西的包裹,来搬运交换的信息 报文流 HTTP报文在HTTP应用程序(客户端.服务器. ...
最新文章
- 2018-3-25论文(Whale Optimizer Algorithm)+(Gery Wolf Optimizer)笔记二---Introduction 对比
- 【百度地图API】百度API卫星图使用方法和卫星图对比工具
- 2021-06-14
- 最适合做老婆主播不是Rita?不是豚豚,也不是纪小鹿,是她
- OpenCV FileStorage类的数据读写操作
- 数学学习过程中的感悟(一)
- 待字闺中之兄弟数字分析
- 深圳电子地图 深圳高清电子地图 来自谷歌电子地图 最高19级地图
- linux设置蓝牙可连接网络,Linux下蓝牙参数设置程序
- ASP.NET WebForm Best Practice 之PostBack
- linux监测系统动态的进程状态命令,Linux命令:动态查看进程的变化(top)!
- Spring知识点一站到底(转载)
- ASP.NET的gridview设置数据格式(DataFormatString={})与 String.Format()【转载】
- 2020山东大学软件测试期末试题
- 将VMware与SoftICE基于网络的远程调试功能相结合
- 四.链式法则及高阶导数
- 支付宝php sdk如何使用,支付宝SDK怎么用啊?
- 短视频的素材在哪里找呢?推荐给你一个好办法
- 前端微信二维码不显示
- 国产AI绘画海克斯科技——爱作画AIGC开放平台