嵌入式系统与单片机|技术阅读
登录|注册

您现在的位置是:嵌入式系统与单片机 > 技术阅读 > ESP8266入门(九)HTTP通信 之get与post方法

ESP8266入门(九)HTTP通信 之get与post方法

上一篇我们简单的用HTTP协议数据包访问了百度的服务器,这一篇我们就详细讲一下HTTP协议中的几个方法。


HTTP协议方法 简介


首先,HTTP协议定义了客户端与服务器交互的方法,其中最基本的有4种,分别是GET方法、POST方法、PUT方法、DELETE方法。
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函数程序改造如下:

#define GET "GET /%s HTTP/1.1\r\nAccept: */*\r\nHost: %s\r\nConnection: Keep-Alive\r\n\r\n"#define POST "POST /%s HTTP/1.1\r\nAccept: */*\r\nContent-Length: %d\r\nHost: %s\r\nConnection: Keep-Alive\r\n\r\n%s"
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上)。


 好了,今天就讲这么多,精彩继续......


原创不易,如果你喜欢我的公众号、觉得我 文章对你有所启发,

请务必“点赞、收藏、转发”,这对我很重要,谢谢!

欢迎订阅    嵌入式小书虫