发送一个HTTP请求有很多途径,例如浏览器、curl命令行、wget命令行等。本文将带你从curl命令行视角来讲解一个http请求中各个不同数据字段的含义
我们先来简单讲解一下 curl
命令。
curl 是一个用来请求 Web 服务器的命令行工具,-v
代表输出通信的整个过程,-d
代表发送 一个POST 请求并在请求正文中带上指定数据,使用方式如下
curl -v -d 'name=hagan' http://www.hagan.zone # 使用post方式请求url并带上数据
请求完整过程如下
hagan@hanyonggang life % curl -v -d 'name=hagan' http://www.hagan.zone
* Trying 42.193.104.246...
* TCP_NODELAY set
* Connected to www.hagan.zone (42.193.104.246) port 80 (#0)
> POST / HTTP/1.1
> Host: www.hagan.zone
> User-Agent: curl/7.64.1
> Accept: */*
> Content-Length: 10
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 10 out of 10 bytes
< HTTP/1.1 301 Moved Permanently
< Server: nginx/1.18.0
< Date: Fri, 30 Jul 2021 01:26:20 GMT
< Content-Type: text/html
< Content-Length: 169
< Connection: keep-alive
< Location: https://www.hagan.zone/
<
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
* Connection #0 to host www.hagan.zone left intact
* Closing connection 0
本文将详细剖析以上数据
Request代表发送请求部分,示例中Request部分代码如下
hagan@hanyonggang life % curl -v -d 'name=hagan' http://www.hagan.zone
* Trying 42.193.104.246...
* TCP_NODELAY set
* Connected to www.hagan.zone (42.193.104.246) port 80 (#0)
> POST / HTTP/1.1 # [请求类型] [请求URL] [协议版本]
> Host: www.hagan.zone # 消息报头
> User-Agent: curl/7.64.1 # 消息报头
> Accept: */* # 消息报头
> Content-Length: 10 # 消息报头
> Content-Type: application/x-www-form-urlencoded # 消息报头
>
* upload completely sent off: 10 out of 10 bytes
Request包含三个部分,分别为 请求行``消息报头(Header)``请求正文(Body)
下面的讲解请参考示例中Request部分代码来理解。
请求行包含三个部分,分别为 请求类型``请求URL``协议版本
> POST / HTTP/1.1 # [请求类型] [请求URL] [协议版本]
本次请求的请求类型为 POST
,常见的请求类型如下
GET
# 请求获取Request-URL所标识的资源POST
# 在Request-URL所标识的资源后附加新的数据HEAD
# 请求获取由Request-URL所标识的资源的响应消息报头PUT
# 请求服务器存储一个资源并用Request-URL作为标识DELETE
# 请求服务器删除Request-URL所标识的资源TRACE
# 请求服务器回送收到的请求消息,主要用于测试或诊断CONNECT
# 保留将来使用OPTIONS
# 请求查询服务器性能、查询资源相关选项、预检请求本次请求的请求URL为 /
本次请求的协议版本为HTTP 1.1,常见的协议版本如下
消息报头有很多种字段类型,本次请求包含如下五个消息报头
> Host: www.hagan.zone # 消息报头
> User-Agent: curl/7.64.1 # 消息报头
> Accept: */* # 消息报头
> Content-Length: 10 # 消息报头
> Content-Type: application/x-www-form-urlencoded # 消息报头
常见的消息报头如下
指定客户端接受哪些类型的信息
text/html
# HTML文本image/gif
# gif图片*/*
# 啥都行客户端接受的字符集
gb2312
# 中文字符iso-8859-1
# 西文字符集utf-8
# 多语言字符可接受的内容编码
gzip
# 压缩类型deflate
# 压缩类型identity
# 默认指定一种自然语言
zh-cn
# 中文证明客户端有权查看某个资源
指定被请求资源的Internet主机和端口号
用户代理
Body编码方式
请求正文有很多种编码方式,请求正文的类型需要根据消息报头的Content-Type
字段来确定,本次请求的编码方式为application/x-www-form-urlencoded
> Content-Type: application/x-www-form-urlencoded # 消息报头
常见的Content-Type类型如下
默认数据编码方式
?name=hagan&age=22
序列化后的JSON字符串
XML作为编码方式的远程调用规范
数据以纯文本形式进行编码
允许body里面包含多个模块,每个模块可以是不同类型,常用于文件上传
需要规定一个用于分割模块的分隔符 boundary
Content-Type: multipart/form-data; boundary=hagan # boundary为分隔符
当指定分隔符为 hagan
时请求体格式如下
--hagan
Content-Disposition: form-data; name="fullname" # name为参数名
haganhan # 参数值 # 规范规定参数值前面必须有两个换行符
--hagan
Content-Disposition: form-data; name="head"; filename="head.png"
Content-Type: image/png # 指定类型
<Buffer 00> # 参数值
--hagan-- # 请求体结束
整个请求体拼装完成后 , 最后会以--分隔符--结尾 --hagan--
--分隔符(boundary)
Content-Disposition: form-data; name="参数名1"
参数值1
--分隔符(boundary)
Content-Disposition: form-data; name="参数名2"
参数值2
--分隔符(boundary)
Content-Disposition: form-data; name="参数名3"
参数值3
--分隔符(boundary)
Content-Disposition: form-data; name="图片名1"; filename="图片文件名1"
Content-Type: 类型
图片文件的二进制内容1
--分隔符(boundary)
Content-Disposition: form-data; name="图片名2"; filename="图片文件名2"
Content-Type: 类型
图片文件的二进制内容2
--分隔符(boundary)
Content-Disposition: form-data; name="图片名3"; filename="图片文件名3"
Content-Type: 类型
图片文件的二进制内容3
--分隔符(boundary)--
只能通过流的方式提交一个二进制或文件
Response代表服务端响应部分,示例中Response部分代码如下
< HTTP/1.1 301 Moved Permanently # 状态行 # [协议版本] [状态码] [状态信息]
< Server: nginx/1.18.0 # 响应报头
< Date: Fri, 30 Jul 2021 01:26:20 GMT # 响应报头
< Content-Type: text/html # 实体报头
< Content-Length: 169 # 实体报头
< Connection: keep-alive # 实体报头
< Location: https://www.hagan.zone/ # 响应报头
<
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
* Connection #0 to host www.hagan.zone left intact
* Closing connection 0
Response也包含三个部分,分别为 状态行``消息报头(Header)``响应正文(Body)
,下面将详细讲解这三部分。
下面的讲解请参考示例中Response部分代码来理解。
状态行包含三个部分,分别为 协议版本``状态码``状态信息
< HTTP/1.1 301 Moved Permanently # 状态行 # [协议版本] [状态码] [状态信息]
本次响应的协议版本为 HTTP/1.1
,常见协议版本如下
本次响应的状态码为 301
,常见状态码如下
指示信息,表示请求已接收,继续处理
成功,表示请求已被成功接收、理解、接受
200
OK,请求成功201
Created,对于那些要服务器创建对象的请求来说,资源已创建完毕202
Accepted,请求已接受,但服务器尚未处理204
No Content,Response包含状态行和消息报头,但不包含响应正文206
Partial Content,部分请求成功重定向,要完成请求必须进行更进一步的操作
301
请求永久重定向至新URL302
请求临时重定向至新URL客户端错误。请求有语法错误或请求无法实现
400
Bad Request,错误的请求401
Unauthorized,需要客户端认证403
Forbidden,请求被服务器拒绝404
Not Found,未找到资源服务端错误,服务端未能实现合法的请求
500
Internal Server Error,内部服务器错误503
Server Unavailable,服务器暂时无法提供服务,一段时间后便可恢复服务本次响应的状态信息为 Moved Permanently
,常见状态信息如下
Response中的消息报头主要分为 响应报头
和 实体报头
本次响应中的响应报头包含如下三个
< Server: nginx/1.18.0 # 响应报头
< Date: Fri, 30 Jul 2021 01:26:20 GMT # 响应报头
< Location: https://www.hagan.zone/ # 响应报头
常见的响应报头如下
重定向接受者到一个新的位置
包含在401响应消息中,客户端收到401
包含了服务器用来处理请求的软件信息
Apache- Coyote/1.1
实体报头也叫正文报头,本次响应中的实体报头包含如下三个
< Content-Type: text/html # 实体报头
< Content-Length: 169 # 实体报头
< Connection: keep-alive # 实体报头
常见的实体报头如下
编码类型是压缩还是非压缩
eg: Content-Encoding: gzip
资源所用的自然语言,没有设置该域则认为实体内容将提供给所有的语言阅读
正文的长度,以字节方式存储的十进制数字表示
响应正文的媒体类型
响应过期的日期和时间
响应正文有很多种类型,响应正文的类型需要根据消息报头的Content-Type
字段来确定,本次响应的编码方式为text/html
< Content-Type: text/html # 实体报头
响应正文如下
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
* Connection #0 to host www.hagan.zone left intact
* Closing connection 0
curl命令只展示数据,不提供数据的解析,如果是浏览器,则会将响应正文以 text/html
的方式进行解析,此时便得到了一个HTML页面
本文会在我的博客持续更新,欢迎访问我的博客 hagan.zone
,也可点击阅读原文直接跳转到文章详情页,里面会包含我最新的修改。
本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/XFlyUxBkv7alsKZHo3xlUw
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。