目录

什么是 HTTP 协议?

HTTP的报文结构

HTTP请求报文

GET请求报文

POST请求报文

HTTP响应报文


什么是 HTTP 协议?

全称:hypertext transfer protocol(超文本传输协议),是 TCP/IP 协议族的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。

通俗的讲,当客户端或者浏览器连接上服务器之后,若想获得 web 服务器中的 web 资源,就必须与 服务端进行通信,通信的双方必须能够解析发送的消息,那么这个消息就要符合一定的通讯格式,HTTP 就是用于定义双方的通信格式。

HTTP的报文结构

http的请求报文和响应报文的格式基本一样,主要分为三部分:

  1. 起始行(start line): 描述请求或响应的状态
  2. 头部字段(header): 以 key:value 的形式展示
  3. 数据实体(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

*.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报文是什么样的?相关推荐

  1. 利用dom4j将实体类转换为对应的xml报文

    利用dom4j生成xml报文 目标格式: <?xml version="1.0" encoding="GBK"?><Packet type=& ...

  2. java 报文长度计算_从TcpClient.GetStream()读取而不知道长度 - java

    我正在研究基于TCP的通信协议.我所知 有很多方法可以确定何时结束阅读. 在消息末尾关闭连接 将消息的长度放在数据本身之前 使用分隔符:一些在正常数据中永远不会出现的值(或者总会以某种方式转义) 通常 ...

  3. mqtt session保持 订阅消息_如何使用 MQTT 报文实现发布订阅功能

    MQTT 协议通过交换预定义的MQTT控制报文来通信.下面以 Connect 连接 MQTT 协议基于 TCP/IP 协议,MQTT Broker 和 Client 都有需要有 TCP/IP 地址. ...

  4. SIP协议的传输层原理报文解析(解读rfc3581)(待排版)

    关于rfc3581/rport参数的阐述 一:简述 一般情况下,服务器在接收到request后,应答发向哪里呢?服务器在计算回应应答的算法是一种混合模式,具体说来是这样的: 1,IP:从哪里接收到的就 ...

  5. 报文如何截取时间_5种报文、8种邻居状态机详解OSPF工作原理

    上一章节介绍了OSPF相比RIP具有无环路.路由收敛速度快.可扩展性好的特点.知识卡片 | 链路状态路由协议OSPF凭什么会取代RIP? 我们知道路由协议的最终目的是为了计算最优路由加入路由表来指导I ...

  6. dhcp报文_动态地址分配DHCP,IP地址管理方式及分配原则,一分钟了解下

    一.DHCP简介 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)用来为网络设备动态地分配 IP 地址等网络配置参数. DHCP 采用客户端/服务器 ...

  7. http协议进阶(三)http报文

    一.报文流 http报文是在http应用程序之间发送的数据块(也可称为数据包).这些数据块以一些文本的元信息(meta-information)开头,描述了报文的内容及含义,后面跟着 可选的数据部分, ...

  8. h3c 3600 acl 配置 滤源IP是网关的ARP报文的ACL规则

    h3c 3600 acl 配置 滤源IP是网关的ARP报文的ACL规则 悬赏分:100 - 解决时间:2009-3-8 14:30 星号之间是我在网上查到的华为交换机的配置方法: ********** ...

  9. 如何突破DNS报文的512字节限制

    "DNS协议大家都应该很熟悉,最近有同学问到如何获得UDP承载的超过512字节的DNS报文,借此机会,我们一起了解下DNS协议与报文长度有关的一些细节." 本文将讨论的是DNS协议 ...

  10. 读书笔记:《图解HTTP》第三章 HTTP报文

    原文地址 博客积累地址 HTTP报文的作用 HTTP报文时是HTTP进行请求和响应时用来交换信息的,可以理解它为搬东西的包裹,来搬运交换的信息 报文流 HTTP报文在HTTP应用程序(客户端.服务器. ...

最新文章

  1. 2018-3-25论文(Whale Optimizer Algorithm)+(Gery Wolf Optimizer)笔记二---Introduction 对比
  2. 【百度地图API】百度API卫星图使用方法和卫星图对比工具
  3. 2021-06-14
  4. 最适合做老婆主播不是Rita?不是豚豚,也不是纪小鹿,是她
  5. OpenCV FileStorage类的数据读写操作
  6. 数学学习过程中的感悟(一)
  7. 待字闺中之兄弟数字分析
  8. 深圳电子地图 深圳高清电子地图 来自谷歌电子地图 最高19级地图
  9. linux设置蓝牙可连接网络,Linux下蓝牙参数设置程序
  10. ASP.NET WebForm Best Practice 之PostBack
  11. linux监测系统动态的进程状态命令,Linux命令:动态查看进程的变化(top)!
  12. Spring知识点一站到底(转载)
  13. ASP.NET的gridview设置数据格式(DataFormatString={})与 String.Format()【转载】
  14. 2020山东大学软件测试期末试题
  15. 将VMware与SoftICE基于网络的远程调试功能相结合
  16. 四.链式法则及高阶导数
  17. 支付宝php sdk如何使用,支付宝SDK怎么用啊?
  18. 短视频的素材在哪里找呢?推荐给你一个好办法
  19. 前端微信二维码不显示
  20. 国产AI绘画海克斯科技——爱作画AIGC开放平台

热门文章

  1. 华雨打shanghtml单页网站源码
  2. 企业数仓DQC数据质量管理实践篇
  3. 多伦多大学计算机科学专业录取ib,多伦多大学要求IB多少分
  4. 洛谷 P2015 二叉苹果树 题解
  5. 【转】十大智能家居系统解决方案
  6. C语言编写两个函数,分别实现两个整数的最小公倍数和最大公约数
  7. ftp voyager_Voyager 2太空飞行最佳样本方差的Python实现
  8. 谷歌地图 官网 详细API
  9. 思量QQ本地会员v3.8官方2013版【免费使用部分QQ会员功能】
  10. 突然发现 ViewState,Linq 水火不容