HTTP粗略入门小白篇
HTTP简述
HTTP协议,即超文本传输协议(HyperText Transfer Protocol),是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。
HTTP本身是Tim Berners-Lee发明的万维网中重要三个概念之一,即URL,HTTP,HTML。
其中,
- URL,俗称网址
- HTTP,两个电脑之间传输内容的协议
- HTML,超级文本,主要用来做页面跳转
通俗地讲,URL 的作用是能让你访问一个页面,HTTP 的作用是让你能下载这个页面,HTML 的作用是让你能看懂这个页面。
通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。
URL
了解HTTP之前,需要了解下URL。
url是统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。
这里主要了解它的结构。比如:
https://www.baidu.com/s?wd=Jay#6
https:// 超文本传输安全协议
www.baidu.com 域名
/s 路径
?wd=Jay 查询参数
#6 锚点
HTTP请求
HTTP/1.1协议中定义了多种请求方法,包括GET,POST,GET,PUT,PATCH, DELETE,HEAD,OPTIONS等,这里只介绍最常见的GET和POST请求。
curl命令
curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具。它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具。
它可以很直观地将你要访问的网站的请求和响应表示出来,这里我们以访问国内最大同性交友网站bilibili为例。
curl -s -v -H "key: value" -- "https://www.bilibili.com"
-s表示不要显示进度
-v显示一次的http请求的通信过程,去掉的话只返回HTML文档,没有请求和响应
-H表示添加后面的内容到请求头,来自定义Header,里面的内容任意,比如:"Referer: www.example.com"
这是一个GET请求
我们将会得到如下结果:
显示内容的头部,HTML文件太大没截全图
显示内容的尾部
其中的请求部分为:
GET请求
当需要发送表单数据到服务器时,可以用POST请求:
curl -X POST -d "title=xxx&text=yyy" www.example.com/add
-X用于指定发送数据的方式,这里是POST
curl默认以application/x-www-form-urlencoded作为Content-Type来发送数据
那么会相应地返回结果如下:
POST / HTTP/1.1
Host: www.examle.com/add
User-Agent: curl/7.56.0
Accept: */*
Content-Length: 18
Content-Type: application/x-www-form-urlencoded
title=xxx&text=yyy
请求的格式
请求方法 路径 协议/版本
Key1: value1
Key2: value2
Key3: value3
Content-Length: n
Content-Type: application/x-www-form-urlencoded
Host: www.example.com
User-Agent: curl/7.56.0要上传的数据
第一行是第一部分,第二行直到回车是第二部分,第三部分永远都是一个回车(\n),请求最多包含四部分,最少包含三部分。(也就是说第四部分可以为空)
请求方法就是前面提到的那几种,常用GET,POST。
这里的路径包括「查询参数」,但不包括「锚点」。
如果你没有写路径,那么路径默认为 / 。
第 2 部分中的 Content-Type 标注了第 4 部分的格式。
用 Chrome 发请求
- 打开 Network
- 地址栏输入网址
- 在 Network 点击,查看 request,点击「view source」
- 如果有请求的第四部分,那么在 FormData 或 Payload 里面可以看到
HTTP响应
在上面访问bilibili的例子中,显示末尾的一部分就是服务器的响应:
GET响应
再加上前面很长的那个HTML文件,一起组成了HTTP响应的结构。
响应的格式
协议/版本号 状态码 状态解释
Key1: value1
Key2: value2
Content-Length: n
Content-Type: text/html要下载的内容
可以看到,响应的格式和请求格式基本一致。
状态码是服务器对浏览器说的话,可以粗暴地如下来记忆:
1xx 表示server说:我知道了,你继续
2xx 表示成功
3xx 表示server说:滚吧
4xx 表示server说:你丫错了
5xx 表示server说:好吧,我错了
一些常见的:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
502 Bad Gateway //作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
用 Chrome 查看响应
- 打开 Network
- 输入网址
- 选中第一个响应
- 查看 Response Headers,点击「view source」
- 查看 Response 或者 Preview,你会看到响应的第 4 部分
Response
URI和URL区别
小插曲,一图盖之:
URI & URL