HTTP协议:超文本传输协议
基于传输层TCP协议,端口80
HTTPS :SSL加密方式
默认端口443
curl库
1. HTTP协议工作流程

建立连接:
int init_tcp_clit()
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
perror("socket");
return -1;
}
struct sockaddr_in clit_addr;
clit_addr.sin_family = AF_INET;
clit_addr.sin_port = htons(PORT);
clit_addr.sin_addr.s_addr = inet_addr(IP);
if (connect(sockfd, (struct sockaddr *)&clit_addr, sizeof(clit_addr)) < 0)
{
perror("connect");
return -1;
}
return sockfd;
}
请求响应:
int send_http(int sockfd,char* city)
{
char buff[1024]= {0};
char *preq = "GET /?app=weather.today&cityNm=";
char *p = "&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json HTTP/1.1\r\n"
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\r\n"
"Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\r\n"
"Connection: close\r\n"
"Host: api.k780.com\r\n"
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/152.0.0.0 Safari/537.36 Edg/152.0.0.0\r\n"
"\r\n";
sprintf(buff, "%s%s%s", preq, city, p);
ssize_t size = send(sockfd, buff, strlen(buff), 0);
if (size < 0)
{
perror("send");
return -1;
}
return 0;
}
接收响应:
int recv_http(int sockfd)
{
int fd = open("weather.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664);
if (fd < 0)
{
perror("open");
return -1;
}
char buf[1024] = {0};
while (1)
{
ssize_t size = recv(sockfd, buf, sizeof(buf), 0);
if (size < 0)
{
perror("recv");
return -1;
}
else if (size == 0)
{
printf("server close\n");
break;
}
write(fd, buf, size);
}
close(fd);
return 0;
}
解析JSON:
int parse_http_response(void)
{
int fd = open("weather.txt", O_RDONLY);
if (fd < 0)
{
perror("open error");
return -1;
}
long len = lseek(fd, 0, SEEK_END);
lseek(fd, 0, SEEK_SET);
char *buff = malloc(len+1);
if (NULL == buff)
{
perror("malloc error");
return -1;
}
memset(buff, 0, len+1);
read(fd, buff, len);
close(fd);
char *p = strstr(buff, "{");
if (NULL == p)
{
perror("strstr error");
return -1;
}
printf("%s\n", p);
cJSON *pjson = cJSON_Parse(p);
if (NULL == pjson)
{
printf("cJSON_Parse error");
return -1;
}
cJSON *pobj= cJSON_GetObjectItem(pjson, "success");
if (NULL == pobj)
{
printf("cJSON_GetObjectItem error success");
return -1;
}
if (0 == strcmp(pobj->valuestring, "1"))
{
pobj= cJSON_GetObjectItem(pjson, "result");
if (NULL == pobj)
{
printf("cJSON_GetObjectItem error result");
return -1;
}
cJSON *pdata = cJSON_GetObjectItem(pobj, "citynm");
printf("citynm : %s\n", pdata->valuestring);
pdata = cJSON_GetObjectItem(pobj, "temperature");
printf("temperature : %s\n", pdata->valuestring);
pdata = cJSON_GetObjectItem(pobj, "weather");
printf("weather : %s\n", pdata->valuestring);
pdata = cJSON_GetObjectItem(pobj, "wind");
printf("wind : %s\n", pdata->valuestring);
}
cJSON_Delete(pjson);
return 0;
}
2. HTTP报文

http请求报文:
GET / HTTP/1.1\r\n (/表示主页)
Host: news.sohu.com\r\n
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101
Firefox/113.0\r\n
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;
q=0.8
Accept-Language: en-US,en;q=0.5\r\n
Connection: keep-alive\r\n
\r\n
Connection:
keep-alive: 长连接:HTTP通信结束,保持一定时间的连接再断开
close:短连接:HTTP通信结束,立马断开连接
HTTP响应报文:
HTTP/1.1 200 OK\r\n
Date: Wed, 02 Sep 2026 06:31:29 GMT\r\n
Content-Type: text/html;charset=utf-8\r\n
Server: openresty
Vary: Accept-Encoding
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Set-Cookie: SUV=1788330689823odinzX9W; Path=/; Domain=sohu.com; Max-
Age=946080000; Expires=Fri, 25 Aug 2056 06:31:29 GMT; Secure; SameSite=None
Trace-Id: a067a38f132249f8a173162c956fc468.88701.17883306898232510
Data-Source:
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
S-REQ-ID: 12342245799539308391
S-REQ-TYPE: 0
X-Cache-Lookup: Cache Miss
Content-Encoding: gzip
Cache-Control: no-cache
Transfer-Encoding: chunked
X-NWS-LOG-UUID: 12342245799539308391\r\n
Connection: keep-alive\r\n
X-Cache-Lookup: Cache Miss\r\n
\r\n
<!DOCTYPE html><html lang=zh-CN><head>
<script>if(window&&window.performance&&typeof
window.performance.now==='function'){


3021

被折叠的 条评论
为什么被折叠?



