HTTP协议的应用

HTTP协议的应用

HTTP协议也称为超文本传输协议(Hypertext [Transfer Protocol](https://baike.baidu.com/item/Transfer Protocol/612755?fromModule=lemma_inlink))是一个简单的基于请求-响应的协议,它通常运行在TCP之上,所以属于应用层协议。

浏览器基本都是基于该协议与服务器通信的,HTTP是基于 TCP/IP 协议来传输数据的,超文本的意思是指HTTP协议不只是支持普通数据,还支持传输文件、图片以及具有超链接功能。

  1. 请求行 *\r\n* 第一部分

  2. 头部字段1 *\r\n* 第二部分

  3. 头部字段2 *\r\n*

  4. *\r\n* 第三部分

  5. 请求包体 *\r\n* 第四部分

请求行 GET/POST SP URL SP HTTP/1.1\r\n

客户端必须指定Host字段: Host : 主机域名 \r\n 比如 “Host: www.baidu.com\r\n”

练习:获取天气信息,可以使用企业提供的天气API接口,比如比较知名的天气相关的API有心知天气,一般需要用户注册平台账号,然后进行个人认证、认证成功之后可以创建应用,得到应用对应的密钥,再通过密钥区访问API接口。

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
 #include <unistd.h>
//TCP客户端代码   ./xxx   port  IP
#define PORT 80
#define IPADDR "116.62.81.138"
#define KEY "Sv87YPoLRn3skQ9hO"

int main(int argc, char const *argv[])
{
	//1.创建TCP套接字
	int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
	if (tcp_socket == -1)
	{
		fprintf(stderr, "tcp socket error,errno:%d,%s\n",errno,strerror(errno));
		exit(1);
	}

	
	//4.发起连接请求,等待接受服务器接受连接
	struct sockaddr_in  dest_addr;
	dest_addr.sin_family 		= AF_INET; 						//协议族,是固定的
	dest_addr.sin_port   		= htons(PORT);			//服务器端口,必须转换为网络字节序
	dest_addr.sin_addr.s_addr   = inet_addr(IPADDR);			//服务器地址 "192.168.64.xxx"  


	int ret = connect(tcp_socket,(struct sockaddr *)&dest_addr,sizeof(dest_addr));
	if (ret < 0)
	{
		fprintf(stderr, "connect error,errno:%d,%s\n",errno,strerror(errno));
		exit(1);
	}
    //用于存储HTTP的请求内容 请求行 请求方法 sp url sp HTTP\1.1 \r\n
    char reqbuf[512] = {0};
    sprintf(reqbuf,"GET https://api.seniverse.com/v3/weather/now.json?key=%s&location=beijing&language=zh-Hans&unit=c "
                                "HTTP/1.1 "
                                "\r\n"
                                "Host:www.api.seniverse.com\r\n"
                                "\r\n"
                            ,KEY);


	//5.说明双方建立连接,此时可以接收数据
    char recvbuf[1024]={0};
	while(1)
	{
        send(tcp_socket,reqbuf,strlen(reqbuf),0);
		recv(tcp_socket,recvbuf,sizeof(recvbuf),0);
		printf("%s\n",recvbuf);
		bzero(recvbuf,sizeof(recvbuf));
		recv(tcp_socket,recvbuf,sizeof(recvbuf),0);
        printf("%s\n",recvbuf);
		bzero(recvbuf,sizeof(recvbuf));
        sleep(5);
	}


	return 0;
}
posted @ 2025-05-15 19:51  骗人就变小狗  阅读(367)  评论(0)    收藏  举报