1. HTTP 协议介绍
基本介绍:
HTTP(Hyper Text Transfer Protocol): 全称超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
HTTP 是一种应用层协议,是基于 TCP/IP 通信协议来传递数据的,其中 HTTP1.0、HTTP1.1、HTTP2.0 均为 TCP 实现,HTTP3.0 基于 UDP 实现。现主流使用 HTTP1.0 和 HTTP3.0
协议: 为了使数据在网络上从源头到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议,它最终体现为在网络上传输的数据包的格式。
注意: 当我们访问一些网页时,是显示通过 HTTPS 来进行通信的,并且当下大多数的网页都是通过 HTTPS 来进行通信的,因为 HTTPS 在 HTTP 的基础上做了一个加密的工作。
2. HTTP 协议的工作过程
当我们在浏览器输入一个网址,此时浏览器就会给对应的服务器发送一个 HTTP 请求,对应的服务器收到这个请求之后,经过计算处理,就会返回一个 HTTP 响应。并且当我们访问一个网站时,可能涉及不止一次的 HTTP 请求和响应的交互过程。
3.URL
URL(Uniform Resource Locator)翻译为统一资源定位符
表示:某个网站资源的某个资源,全球唯一
URL 基本格式
-
URL 的标准格式如下:
-
协议类型:[//服务器地址[:端口号]][/资源层级 UNIX 文件路径]文件名[?查询字符串][#片段标识符]
使用HTTP的URL:
-
http://<主机>:<端口>/<路径>;
HTTP的默认端口号:80
https:加密,默认端口号443;
4、HTTP有两类报文
抓包得到的请求报文:
响应成功得到的:
HTTP/1.1 200 OK:这表示HTTP请求已成功被服务器接收、理解,并且返回了一个成功的状态码200。
Server: nginx:这表示处理请求的服务器是Nginx。Nginx是一个高性能的HTTP和反向代理web服务器,也常作为IMAP/POP3/SMTP代理服务器。
Date: Fri, 30 Aug 2024 01:32:26 GMT:这是服务器发送响应的日期和时间,使用GMT(格林尼治标准时间)表示。
Content-Type: application/json; charset=utf-8;:这指定了返回的内容类型是JSON格式,并且字符编码是UTF-8。
Transfer-Encoding: chunked:这表示传输编码是块编码(chunked encoding),意味着响应体会被分割成多个块进行发送,每个块都有自己的大小指示,直到一个大小为0的块表示响应体结束。
Connection: keep-alive:这表示连接将保持活动状态,以便在同一个连接上发送和接收更多的HTTP请求和响应,从而提高性能。
**Access-Control-Allow-Origin: ***:这是一个CORS(跨源资源共享)头部,表示该资源允许来自任何源的请求。这对于Web应用从前端向后端请求数据非常有用,尤其是当它们部署在不同的域上时。
接下来的部分是实际的响应体,它以20b开始,这表示接下来的数据块大小是32字节(十六进制20b转换为十进制是32),然后是JSON格式的天气预报数据,最后是一个大小为0的块,表示数据结束。
JSON数据包含了以下信息:
success:"1" 表示请求成功。
result对象包含了详细的天气信息,如城市编号(weaid)、日期(days)、星期(week)、城市名称(citynm)、温度(temperature、temperature_curr)、湿度(humidity)、空气质量指数(aqi)、天气状况(weather、weather_curr)、天气图标(weather_icon)、风向(wind)、风力(winp)、最高和最低温度(temp_high、temp_low)、当前温度(temp_curr)、最高和最低湿度(humi_high、humi_low,这里为0可能表示未提供)、天气ID(weatid)、风力ID(windid)和风向ID(winpid)等。
5. HTTP 响应(Response)
5.1 认识“状态码”(status code)
状态码表示访问一个页面的结果(如访问成功、失败,还是其它一些情况等等),它是一个3位的整数,从 1xx、2xx、3xx、4xx、5xx,分为五个大类,每个大类的含义都不同。以下介绍一些常见的状态码及它的状态码解释
200 OK
表示访问成功
404 Not Found
表示没有找到资源
当你发送请求的 URL 在服务器中找不到该资源,就会出现 404
403 Forbidden
表示访问被拒绝
有的页面通常需要用户有一定的权限才能访问,如未登录
405 Method Not Allowed
表示访问的服务器不能支持请求中的方法或者不能使用该请求中的方法
500 Internal Server Error
表示服务器出现内部错误
一般是服务器的代码执行过程中遇到了一些特殊的情况,造成服务器崩溃可能会产生这个状态码
504 Gateway Timeout
表示当前服务器负载比较大,服务器处理单条请求的时耗很长,就会出现超时情况
302 Move temporarily
表示临时重定向
重定向相当于手机呼号的呼叫转移功能,如果我们换了一个手机号,就可以去办理该呼叫转移业务,使朋友拨打你的旧号码时,自动跳转到新号码
301 Moved Permanently
表示永久重定向,当浏览器收到这种响应时,后续的请求都会被自动改成新的地址
5.2 认识响应“报头”(header)
响应报头的基本格式和请求报头的格式基本一致,下面介绍下响应报头的 Content-Type 参数
Content-Type
Content-Type 表示 body 的数据格式,以下介绍三种响应中的数据格式
text/html
表示数据格式是 HTML
text/css
表示数据格式是 CSS
application/javascript
表示数据各式是 JavaScript
application/json
表示数据格式是 JSON
练习:获取网站的天气数据
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int fd = open("./data",O_RDONLY); //data文件是请求报文
if(-1 == fd)
{
perror("open");
exit(1);
}
char buf[1024]={0};
read(fd,buf,sizeof(buf));
close(fd);
char* end = NULL;
char *days=strstr(buf,"days");
char *week =strstr(buf,"week");
char *city =strstr(buf,"citynm");
char *temp =strstr(buf,"temperature");
char *wea =strstr(buf,"weather");
days+=7;
end = strchr(days,'"');
*end = '\0';
week+=7;
end = strchr(week,'"');
*end = '\0';
city+=9;
end = strchr(city,'"');
*end = '\0';
temp+=14;
end = strchr(temp,'"');
*end = '\0';
wea+=10;
end = strchr(wea,'"');
*end = '\0';
printf("%s %s %s %s %s\n",days,week,city,temp,wea);
return 0;
}