当前位置: 首页 > 科技观察

跟着小白学鸿蒙——】简单Http客户端(12)

时间:2023-03-21 13:36:58 科技观察

了解更多开源请访问:开源基础软件社区https://ost.51cto.com在《#跟着小白一起学鸿蒙# [二] 第一个OpenHarmony程序》中,我们熟悉了如何在开源的鸿蒙开发应用,通过hdc工具拷贝到开发板运行。不过当时我们只是打印了一个最简单的helloworld,接下来会讲到最常用的部分的开发,一个简单的http客户端;概述HTTP是一种基于TCP/IP传输数据(HTML文件、图片文件、查询结果等)的通信协议。HTTP是属于应用层的面向对象的协议。由于其方法简单快速,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用和发展,不断完善和扩展。WWW目前使用的是HTTP/1.0的第六版。HTTP/1.1的标准化工作正在进行中,已经提出了HTTP-NG(NextGenerationofHTTP)的提案。HTTP协议在客户端-服务器架构上工作。浏览器作为HTTP客户端,将所有请求通过URL发送给HTTP服务器,即WEB服务器。Web服务器根据收到的请求向客户端发送响应信息。HTTP请求报文Request的数据结构如下。A获取示例,在浏览器中输入www.baidu.com,回车即可看到浏览器中显示的百度页面。按F12查看具体内容:可以看到请求的url为www.baidu.com,请求方式为GET,服务器IP地址为180.101.49.14:443(https,如果是http是80)。在上图的一个Post示例中,我们可以看到请求的url是https://cysz.hopethink.com/qhhsd/app/getH5HsdList,请求的方法是POST,服务器的IP地址是114.215.124.251:443(https,如果http为80),请求内容类型application/x-www-form-urlencoded;charset=UTF-8,请求数据长度84,请求数据keyword=&streetId=&pageNum=1&pageSize=1&ip=222.95.30.84.本例参考熊派设计,使用熊派HM_Micro开发板进行验证。应用开发流程图LRbuildbuild.gn-->buildhelloworld.c-->添加httpget-->添加httppost-->验证buildBuild.gn。import("//build/lite/config/component/lite_component.gni")executable("hello_world_lib"){output_name="hello_world"sources=["hello_world.c"]include_dirs=[]defines=[]cflags_c=[]ldflags=[]}lite_component("my_app"){features=[":hello_world_lib",]}构建helloworld.c。#includeintmain(intargc,char**argv){printf("\n******************************************************\n");printf("\n\t\t你好httpget!\n");printf("\n*****************************************************\n\n");返回0;}添加httpget。intsockfd,ret,i,h;structsockaddr_inservaddr;charstr1[BUF_SIZE],str2[BUF_SIZE],buf[BUF_SIZE],*str;socklen_tlen;fd_sett_set1;结构timevaltv;//创建套接字if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){printf("createsocketfailed---exit(0)!\n");退出(0);};bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_port=htons(PORT);if(inet_pton(AF_INET,IPSTR_GET,&servaddr.sin_addr)<=0){printf(“inet_pton失败---退出(0)!\n”);exit(0);};if(connect(sockfd,(structsockaddr*)&servaddr,sizeof(servaddr))<0){printf("connectfailed,exit(0)!\n");exit(0);}printf("连接远程服务器\n");memset(str2,0,BUF_SIZE);strcat(str2,"theDataToGet");str=(char*)malloc(BUF_SIZE);len=strlen(str2);sprintf(str,"%d",len);//请求头部内容memset(str1,0,BUF_SIZE);strcat(str1,"GET/HTTP/1.1\n");strcat(str1,"Host:www.baidu.com\n");strcat(str1,"Content-Type:text/html\n");strcat(str1,"Content-Length:");strcat(str1,str);//请求空行strcat(str1,"\n\n");//请求参数strcat(str1,str2);strcat(str1,"\r\n\r\n");printf("%s\n",str1);ret=write(sockfd,str1,strlen(str1));if(ret<0){printf("套接字写入失败!errcode%d,errmsg'%s'\n",errno,strerror(errno));exit(0);}else{printf("socketwrite%dbytes!\n\n",ret);}FD_ZERO(&t_set1);FD_SET(sockfd,&t_set1);while(1){sleep(2);h=0;h=select(sockfd+1,&t_set1,NULL,NULL,&tv);如果(h<0){关闭(sockfd);printf("SELECT错误,返回-1!\n");返回-1;};如果(h>0){内存设置(buf,0,BUF_SIZE);i=读取(sockfd、buf、BUF_SIZE);如果(i==0){关闭(sockfd);printf("读取0,返回-1!\n");返回-1;}printf("%s\n",缓冲区);}}close(sockfd);return0;httppost:intsockfd,ret,i,h;structsockaddr_inservaddr;charstr1[BUF_SIZE],str2[BUF_SIZE]],buf[BUF_SIZE],*str;socklen_tlen;fd_sett_set1;structtimevaltv;if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){printf("创建套接字失败---退出(0)!\n");退出(0);};bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_port=htons(PORT);if(inet_pton(AF_INET,IPSTR_POST,&servaddr.sin_addr)<=0){printf("inet_ptonfailed---exit(0)!\n");exit(0);};if(connect(sockfd,(structsockaddr*)&servaddr,sizeof(servaddr))<0){printf("connectserverfailed,exit(0)!\n");exit(0);}printf("连接到服务器\n");memset(str2,0,BUF_SIZE);strcat(str2,"keyword=&streetId=&pageNum=1&pageSize=1&ip=222.95.30.84");str=(char*)malloc(BUF_SIZE);len=strlen(str2);sprintf(str,"%d",len);//请求头部内容memset(str1,0,BUF_SIZE);strcat(str1,"POST/qhhsd/app/getH5HsdListHTTP/1.1\n");strcat(str1,"Host:cysz.hopethink.com\n");strcat(str1,"Content-Type:application/x-www-form-urlencoded\n");strcat(str1,"Content-Length:");strcat(str1,str);//请求空行strcat(str1,"\n\n");//str2值为post数据strcat(str1,str2);strcat(str1,"\r\n\r\n");printf("%s\n",str1);ret=write(sockfd,str1,strlen(str1));如果(ret<0){printf("socket写入失败!errcode%d,errmsg'%s'\n",errno,strerror(errno));exit(0);}else{printf("socket写入%d字节\n\n",ret);}FD_ZERO(&t_set1);FD_SET(sockfd,&t_set1);tv.tv_sec=0;tv.tv_usec=0;h=0;while(1){sleep(2);h=select(sockfd+1,&t_set1,NULL,NULL,&tv);if(h==-1){close(sockfd);printf("selecterror,return-1\n");return-1;};if(FD_ISSET(sockfd,&t_set1)){memset(buf,0,BUF_SIZE);i=read(sockfd,buf,BUF_SIZE);if(i==0){close(sockfd);printf("读取0,返回-1!\n");return-1;}printf("%s\n",buf);}}close(sockfd);return0;main中添加方法和头文件头文件#include#include#include#include#include#include#defineIPSTR_GET"180.101.49.14"//服务器IP地址,在上面找到;#defineIPSTR_POST"114.215.124.251"#definePORT80#defineBUF_SIZE4096methodhttpget();httppost();testResult:Gettestresult:Posttestresult:总结http是一个建立在socket上的数据结构化应用协议,所有功能可以通过组合socket包来实现。后面我们可以使用这个接口来实现会计地图的接口应用。了解更多开源知识,请访问:开源基础软件社区https://ost.51cto.com。