上一篇我们简单的用HTTP协议数据包访问了百度的服务器,这一篇我们就详细讲一下HTTP协议中的几个方法。
HTTP协议方法 简介
URL(uniform resource locator)全称是统一资源定位系统,由于互联网上的资源可以用简单的字符串来表示,而这些字符串就被称作:“统一资源定位器”(URL)。简单的讲,我们可以这样认为,一个URL字符串,用于描述互联网上的资源,而HTTP协议中的GET、POST、PUT、DELETE方法就分别对应着对这个资源的查看、修改、增加和删除4个操作。
HTTP协议之请求消息格式(Request)
向服务器发送HTTP数据包的格式如下图:
HTTP的数据包格式大致分为3部分,第一部分为请求行,第二部分是请求头,第三部分才是请求的数据。
在请求行中,URL就是http://www.baidu.com,版本为HTTP1.1,我们这里要说的就是请求方法,如下表:
GET | 向服务器获取资源 |
POST | 告诉服务器一些信息 |
PUT | 向服务器上传新内容 |
DELETE | 删除服务器资源 |
GET就是向服务器获取资源,对应访问网页来讲,要获取的资源往往是一个页面。
POST就是要告诉服务器一些信息(比如在购物链接中,告诉服务器我是谁,我要买什么东西、我要支付多少钱),这时就需要用POST方法了。
PUT就是向服务器上传新内容。
DELETE顾名思义就是用来删除服务器资源的。
其中最主要的就是GET和POST方法了。
ESP8266程序设计
我们把上一篇的发送HTTP请求包的函数修改一下,让他支持GET方法和POST方法。这样我们访问互联网服务器就变得简单多了。
说干就干,syp_Http_Read_File函数程序改造如下:
void ICACHE_FLASH_ATTR syp_Http_Read_File(char * URL,char *methed,char *Post_Data){
ip_addr_t addr;
||清空buffer
memset(syp_http_send_buffer,0,sizeof(syp_http_send_buffer));
||解析URL
syp_Http_Parse_Request_Url(URL,host,file_name,&http_port);
||根据请求方法准备HTTP数据包
if(strcmp(methed,"GET") == 0){
||准备GET数据包
os_sprintf(syp_http_send_buffer,GET,file_name,host);
}else if(strcmp(methed,"POST") == 0){
||准备POST数据包
os_sprintf(syp_http_send_buffer,POST,file_name,strlen(Post_Data),host,Post_Data);
}else{
os_sprintf(syp_http_send_buffer,GET,file_name,host);
}
espconn_gethostbyname(&syp_user_tcp_conn, host, &addr, dns_found_callback_found_cb);
}
参数增加了methed方法和POST发送的数据Post_Data
数据发送函数如下:
void ICACHE_FLASH_ATTR syp_user_tcp_connect_cb(void *arg) {
struct espconn *pespconn = arg;
||TCP连接成功注册回调函数
espconn_regist_recvcb(pespconn, syp_user_tcp_recv_cb); //注册接收数据的回调函数
espconn_regist_sentcb(pespconn, syp_user_tcp_sent_cb); //注册发送数据成功的回调函数
espconn_regist_disconcb(pespconn, syp_user_tcp_discon_cb); //注册断开连接的回调函数
||发送HTTP数据包
espconn_sent(pespconn,syp_http_send_buffer,strlen(syp_http_send_buffer));
}
调用修改后的HTTP解析函数,再次访问下百度服务器,函数如下:
void ICACHE_FLASH_ATTR Wifi_conned(void *arg){
status = wifi_station_get_connect_status();
||判断连接状态
if (status == STATION_GOT_IP) {
||Wifi 连接成功
os_printf("Wifi connect success!");
||用GET方法访问百度服务器
syp_Http_Read_File("http://www.baidu.com","GET",NULL);
return;
} else {
if (count >= 7){
||Wifi 连接失败
os_printf("Wifi connect fail!");
return;
}
}
}
好了,函数修改完成,编译下载并运行,串口助手打印信息如下:
补充
1、GET请求数据包
如图,在打开的浏览器中,打开百度网页搜索esp8266
网址栏的数据如下:
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=62095104_43_oem_dg&wd=esp8266&fenlei=256&rsv_pq=d9536ba70000cf78&rsv_t=d570eD3qIyTiIlAeE6DugvvTXSr%2BTvx%2Flo71plQRxzXaHkLZahxLDdfohVVPe%2BfWb9J2ZGNR2z0c&rqlang=cn&rsv_enter=1&rsv_dl=ib&rsv_sug3=2&rsv_sug1=1&rsv_sug7=001&rsv_n=2 |
GET请求的数据会附加到URL之后(也就是把数据放到HTTP协议头中)
用问号 ? 分割URL和传输的数据。
各个参数之间用 & 相连。
发送的数据如果是字母和数字就原样发送( 如:wd=esp8266)
其他字符(汉字等)用BASE64加密,得出 %XX (如:%2B)
2、POST请求数据包
POST方法则会把提交的数据放到HTTP数据包的包体中(请求数据中)。因此POST的安全性要比GET高(例如:用GET提交数据,用户名和密码会以明文的形式出现在URL上)。
好了,今天就讲这么多,精彩继续......
原创不易,如果你喜欢我的公众号、觉得我 文章对你有所启发,
请务必“点赞、收藏、转发”,这对我很重要,谢谢!
欢迎订阅 嵌入式小书虫