简介
HTTP是一种文件传输协议,规定浏览器与服务器的传输规则,主要有请求与响应两部分。
命令行发送get请求
$ curl -v -- "https://www.baidu.com"
复制代码
如上就是curl发送get请求的写法,你会看到如下内容
* Rebuilt URL to: www.baidu.com/
* Trying 104.193.88.123...
* TCP_NODELAY set
* Connected to www.baidu.com (104.193.88.123) port 80 (#0)
> GET / HTTP/1.1
> Host: www.baidu.com
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
< Connection: Keep-Alive
< Content-Length: 2381
< Content-Type: text/html
< Date: Sat, 13 Oct 2018 03:25:42 GMT
< Etag: "588604eb-94d"
< Last-Modified: Mon, 23 Jan 2017 13:28:11 GMT
< Pragma: no-cache
< Server: bfe/1.0.8.18
< Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
<
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc>
复制代码
以上内容中分别是什么意思呢?
- 星号*开头的书注释
- 大于号>开头的是请求信息
- 小于号<开头的是响应信息
- 后面的是响应内容
命令行发送post请求
$ curl -X POST -v -- "https://www.baidu.com"
复制代码
内容如下
> POST / HTTP/1.1
> Host: www.baidu.com
> User-Agent: curl/7.54.0
> Accept: */*
> Content-Length: 5
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 5 out of 5 bytes
< HTTP/1.1 302 Found
< Connection: Keep-Alive
< Content-Length: 17931
< Content-Type: text/html
< Date: Fri, 19 Apr 2019 07:44:58 GMT
< Etag: "54d97487-460b"
< Server: bfe/1.0.8.18
<
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<style data-for="result" id="css_result">
复制代码
请求头Header
发送请求的时候,一般需要把服务器需要的数据传送过去,可以在命令中加入 -H "xxx: yyy" 到请求头中,注意:加入请求头的内容必需是 key: value 的形式
$ curl -X POST -v -H "xxx:yyy" -- "https://www.baidu.com"
复制代码
> POST / HTTP/1.1
> Host: www.baidu.com
> User-Agent: curl/7.54.0
> Accept: */*
> xxx:yyy
>
< HTTP/1.1 302 Found
< Connection: Keep-Alive
< Content-Length: 17931
< Content-Type: text/html
< Date: Fri, 19 Apr 2019 07:51:58 GMT
< Etag: "54d97488-460b"
< Server: bfe/1.0.8.18
<
复制代码
请求的内容中就多了一行>xxx:yyy
请求格式
1 动词 路径 协议/版本
2 Key1: value1
2 Key2: value2
2 Key3: value3
2 Content-Type: application/x-www-form-urlencoded
2 Host: www.baidu.com
2 User-Agent: curl/7.54.0
3
4 要上传的数据
复制代码
- 首先请求至少包含三部分(如果要发送数据,数据就是第四部分)
- 第一部分包括了用什么方法(动词,路径(请求的网站)用什么版本(版本)的什么协议(协议)
- 第二部分包括了请求内容(请求头)
- 第三部分是一个回车换行符,用来分割第二部分和第四部分
- 第四部分是发送的数据
注意
- 这里的路径包括「查询参数」,但不包括「锚点」
- 可用的请求方法有 GET POST PUT PATCH DELETE HEAD OPTIONS 等
- 如果你没有写路径,那么路径默认为 /
- 第二部分中的 Content-Type 标注了第 4 部分的格式
响应格式
1 协议/版本号 状态码 状态解释
2 Key1: value1
2 Key2: value2
2 Content-Length: 17931
2 Content-Type: text/html
3
4 要下载的内容
复制代码
- 第一部分首先说明我用什么版本(版本)的什么协议(协议),状态码以及解释
- 第二部分包括了响应的信息,但是不是主要内容,只是此次响应的基本信息
- 第三部分也是一个回车换行符,用来分割第二部分和第四部分
- 第四部分才是响应的内容,一般为JSON数据或者HTML页面
用Chrome浏览器发送HTTP请求
- 打开Network
- 地址栏输入地址
- 在Network点击, 查看request,点击「view source」
- 你会看到请求的前三部分
- 如果有第四部分, 可以在FormData或Payload中看到
用Chrome浏览器查看HTTP响应
- 打开Network
- 地址栏输入地址
- 选中第一个响应
- 查看 Response Headers,点击「view source」
- 你会看到响应的前两部分
- 查看 Response 或者 Preview,你会看到响应的第 4 部分