网络应用(6):http报文结构与curl的使用
http是一个协议,协议就是约定、规定,先不管为什么这么约定有什么高深的东西,为了解决具体问题,我们先要能使用协议,理解协议中对我们有用的那部分数据,是的,我们不是研究生,更不是纯研究,所有的研究都要由具体的问题来驱动。
那这里的具体问题是什么?就是看懂http的请求跟回复啊,就像写某某申请一样,你不理申请最终怎么传递出去,你先要知道以什么格式来写,对方回复后你怎么看明白它,这才是基本的。所以,http的请求格式跟回复格式,其实也只是形式上的东西,形式是多变而不稳定的,更不是什么深奥的东西,它只是表达了一些内容。
那就来看看http请求与响应的形式上的东西吧。
本文介绍http请求与响应的报文结构,以及curl的使用。
先抓个包来直观看一下,在百度的搜索框中,敲入“helloworld”并回车,这时会发起一个http请求,用charles来抓包(为什么用它?因为我介绍过!),可以看到这样的请求与响应的信息:
从数据包来看,有一个GET方法,返回了200的状态码,等等。但这里混合了请求与响应的信息,如果分开来看,请求与响应各自有什么数据组织结构呢?
(1)请求报文
http请求数据,使用的结构是这样的:
{请求行,请求头,请求体}
小程引用网上的一张图,这张图描绘了这个结构:
参照上图,请求行是这个样子:
GET /index.html HTTP/1.1
或者:
POST /xiaocheng/about.html HTTP/1.1
...
注意,请求行一般不包括host的地址,而host地址存放在请求头中。
然后是请求头,分为多行,每一行是一个键值对(key: value的格式),比如请求头是这个样子的:
最后是请求体,一般来说GET方法是不带请求体的,因为所有内容都放到请求行(特别是url中)或请求头中了,一般来说POST方法需要带请求体,比如在iTunes下载一个APP时,POST请求数据是这样的:
不要觉得好新奇,又是请求行、请求头又是请求体的,这都只是规则,形式上的东西,以这种形式传递了内容。
(2)响应报文
响应数据的结构,也可以分三部分:
{响应行,响应头,响应体}
这里给一个响应实例:
响应行,也叫状态行,包括http的版本、状态码与状态描述。
响应头跟请求头一样,由一行一行的key-value构成。
响应体一般就是请求方想要的数据了,但响应体不一定会存在,比如HEAD请求方法时不返回响应体(这时响应行就是请求方想要的)。
规则上是这样的,响应/请求行就是一行,响应/请求头就是key-value的集合,响应/请求体就是各种格式的数据(xml、gif、png等格式)。
http请求与响应数据,还有其它的一些知识,比如GET与POST的区别、返回404/403/303表示什么意思,等等,这个谁用谁查,不细说。
但我想说一个工具,一个可以发起http请求的工具,好用,就是curl。
(3)curl的使用
小程使用的是macos,mac自带了curl工具。
curl的功能也算强大的,提供了系列的选项,这里只介绍一些常规的使用方式。
get请求,与保存
curl www.baidu.com
curl "http://172.17.21.197:54321?pa1=hello"
// 保存,下载
curl -o file.html www.baidu.com
curl -o i.jpg http://img3.douban.com/lpic/s4549903.jpg
// -A 仿造ie与运行平台
curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" www.baidu.com
// -e 仿造入口链接(即referer,用于盗链)
curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -e "www.google.com" www.baidu.com
// -x 使用代理
curl -x a.b.c.d:54321 http://google.com
// -D 保存cookie到文件
curl www.baidu.com -o aa.txt -D cookie.txt
// -b 读取文件并当作cookie数据来请求
curl www.baidu.com -b cookie.txt
// -H 设置请求头,这里设置了cookie跟ua
curl -H "Cookie: install_id=14621691626; sid_guard=\"0eb878191489e4247f643672c932c814|1504782359|2592000|Sat\054 07-Oct-2017 11:05:59 GMT\"; \n User-Agent: xxx/1.5.6 (iPhone; iOS 10.2; Scale/2.00)" "https://xxx.yy.com/..."
post
// -d 请求体
curl -d "user=nickwolfe&password=12345" http://www.linuxidc.com/login.cgi
curl -d "key=jet" 192.168.2.32:54321
post,以表单的方式(multipart/form-data)
// "file"为key名,随便起,后面为文件路径(包括文件包)
curl -F "file=@./myfile.ok" "http://172.17.xx.xx:54321"
总结一下,本文介绍了http请求与响应报文的数据结构,也介绍了用于发送http请求的工具curl的使用。文章的目的,一方面是让你巩固http报文的结构(其实这只是形式的东西,不要太在意),另一方面掌握一个便利的发送http请求的工具(这个就很实用了)。
网络应用(6):http报文结构与curl的使用的更多相关文章
- HTTP协议报文结构及示例
HTTP基本架构 下面我们用一张简单的流程图来展示HTTP协议基本架构,以便大家先有个基本的了解. 9.png Web Client可以是浏览器.搜索引擎.机器人等等一切基于HTTP协议发起http请 ...
- modbus tcp数据报文结构
modbus tcp数据报文结构 请求:00 00 00 00 00 06 09 03 00 00 00 01 响应:00 00 00 00 00 05 09 03 02 12 34 一次modbus ...
- 《图解HTTP》读书笔记(五:HTTP报文结构)
用于 HTTP 协议交互的信息被称为 HTTP 报文. 请求端(客户端) 的HTTP 报文叫做请求报文, 响应端(服务器端) 的叫做响应报文.HTTP 报文本身是由多行(用 CR+LF 作换行符) 数 ...
- HTTP 协议基础概念和报文结构
基础概念 1.WWW(World Wide Web,万维网)构建技术有3项: (1)把SGML(Standard Generalized Markup Language,标准通用标记语言)作为页面的文 ...
- HTTP 请求/响应报文结构
请求报文和响应报文都是由以下4部分组成: 1.请求行/响应行 2.请求头/响应头 3.空行 4.消息主体(请求体/响应体) 请求报文结构 请求行 格式为:Method Request-URI HTTP ...
- http的报文结构和状态码的含义
HTTP响应报文解剖 响应报文结构 HTTP的响应报文也由三部分组成(响应行+响应头+响应体): 以下是一个实际的HTTP响应报文: ①报文协议及版本: ②状态码及状态描述: ③响应报文头,也是由多个 ...
- HTTP协议图--HTTP 协议报文结构
1.HTTP 报文 用于 HTTP 协议交互的信息被称为 HTTP 报文.请求端(客户端)的 HTTP 报文叫做请求报文:响应端(服务器端)的叫做响应报文.HTTP 报文本身是由多行(用 CR[car ...
- 接口测试01 - HTTP协议报文结构及示例
HTTP基本架构 用一张简单的流程图来展示HTTP协议的基本架构,以便先有个基础的了解. 1)Web Client可以是浏览器.搜索引擎等等一切基于HTTP协议发起http请求的工具. 2)Web S ...
- HTTP报文结构及Cookie、session区别
目录 万维网 HTTP超文本传输协议 特点 HTTP的报文结构. 下面介绍http请求报文最主要的一些特点 在服务器上存放用户的信息(Cookie) 实例: 工作原理: cookie中的主要内容: C ...
随机推荐
- mysql date函数相关用法整理(持续更新)
date_add(now(), INTERVAL 1 day) 增加一天 date_format(d,'%Y-%m-%d %T') 这里的d为datestamp类型,格式化成 yyyy-MM ...
- JS性能优化——数据存取
首先,了解几个概念: 字面量:它只代表自身,不存储在特定的位置.JavaScript中的字面量有:字符串.数字.布尔值.对象.数组.函数.正则,以及特殊的null和undefined值 本地变量:使用 ...
- Docker与虚拟化
核心知识点: 1.虚拟化的定义?虚拟化的核心和目标? 2.虚拟化的分类?Docker属于那种虚拟化? 3.Docker与传统虚拟化的区别?docker是直接在操作系统上实现虚拟化,直接复用本地操作系统 ...
- JAVA各版本更新特性1-8
JAVA各版本更新特性1-8 原文地址 Java Versions, Features and History This article gives you a highlight of import ...
- Cocos2d-x中单例的使用
大家都知道一个程序中只有一个导演类,eg: CCDirector *pDirectory = CCDirector::sharedDirector();//初始化导演类. 可通过 pDirectory ...
- Android SDK和NDK
NDK是用来给安卓手机开发软件用的,但是和SDK不同的是它用的是C语言,而SDK用的是Java语言.NDK开发的软件在安卓的环境里是直接运行的,一般只能在特定的CPU指令集的机器上运行,而且C语言可以 ...
- app测试点-1
一.安全测试 1.软件权限 1)扣费风险:包括短信.拨打电话.连接网络等. 2)隐私泄露风险:包括访问手机信息.访问联系人信息等. 3)对App的输入有效性校验.认证.授权.数据加密等方面进行检测 4 ...
- SVN版本控制详解
1 版本控制 1.1 如果没有版本控制? Team开发必备. 一个人开发(必备). 版本控制:控制(代码)版本. 论文:版本控制? 毕业论文-4-22.doc 毕业论文-5-01.doc 毕业论文-f ...
- [转] 编写高效的 CSS 选择器
高效的CSS已经不是一个新的话题了,也不是我一个非得重拾的话题,但它却是我在Sky公司工作之时,所感兴趣的,关注已久的话题. 有很多人都忘记了,或在简单的说没有意识到,CSS在我们手中,既能很高效,也 ...
- XmlSerialize error: There was an error generating the XML document.
今天遇到一个很火的问题, 一个c#的class 序列化成xml后抛出异常, 信息为: XmlSerialize error: There was an error generating the XML ...