文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

跟着小白一起学鸿蒙--]简单Http客户端(十二)

2024-12-13 21:01

关注

​想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com​

在《#跟着小白一起学鸿蒙# [二] 第一个OpenHarmony程序》我们熟悉了如何在开源鸿蒙开发应用,并通过hdc工具拷贝至开发板运行。但是那时候我们只是打印了最简单的hello world,接下来我们就讲开发最常用的部分,一个简单的http客户端;

概述

HTTP请求消息Request

在浏览器输入www.baidu.com然后回车即可看到浏览器显示了百度的页面,按F12可以看到具体内容:

​上图里我们可以看到在请求的url是www.baidu.com​​,请求的方法是GET,服务器的IP地址是180.101.49.14:443(https,若是http就是80)。

此样例参考小熊派设计,使用小熊派HM_Micro开发板进行验证。

应用开发流程

graph LR
建立build.gn --> 建立helloworld.c --> 添加httpget --> 添加httppost --> 验证

建立Build.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。

#include 
int main(int argc, char **argv)
{
printf("\n************************************************\n");
printf("\n\t\tHello httpget!\n");
printf("\n************************************************\n\n");
return 0;
}

添加httpget。

int sockfd, ret, i, h;
struct sockaddr_in servaddr;
char str1[BUF_SIZE], str2[BUF_SIZE], buf[BUF_SIZE], *str;
socklen_t len;
fd_set t_set1;
struct timeval tv;
//创建套接字
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
printf("create socket failed--- exit(0)!\n");
exit(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 failed --- exit(0)!\n");
exit(0);
};
if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
printf("connect failed, exit(0)!\n");
exit(0);
}
printf("connect remote server\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("socket write failed! errcode%d,errmsg'%s'\n",errno, strerror(errno));
exit(0);
}else{
printf("socket write %d bytes!\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);
if (h < 0) {
close(sockfd);
printf("SELECT error, return -1!\n");
return -1;
};

if (h > 0){
memset(buf, 0, BUF_SIZE);
i= read(sockfd, buf, BUF_SIZE);
if (i==0){
close(sockfd);
printf("read 0, return -1!\n");
return -1;
}
printf("%s\n", buf);
}
}
close(sockfd);
return 0;

httppost:

int sockfd, ret, i, h;
struct sockaddr_in servaddr;
char str1[BUF_SIZE], str2[BUF_SIZE], buf[BUF_SIZE], *str;
socklen_t len;
fd_set t_set1;
struct timeval tv;

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
printf("create sockt failed---exit(0)!\n");
exit(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_pton failed---exit(0)!\n");
exit(0);
};
if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
printf("connect server failed, exit(0)!\n");
exit(0);
}
printf("connect to server\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/getH5HsdList HTTP/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));
if (ret < 0) {
printf("socket write failed! errcode%d, errmsg'%s'\n",errno, strerror(errno));
exit(0);
}else{printf("socket write %d bytes\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("select error, 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("read 0, return -1!\n");
return -1;
}
printf("%s\n", buf);}
}
close(sockfd);
return 0;

在main里增加方法和头文件。

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define IPSTR_GET "180.101.49.14" //服务器IP地址,上面查出来的;
#define IPSTR_POST "114.215.124.251"

#define PORT 80
#define BUF_SIZE 4096

httpget();
httppost();

测试结果:

Get测试结果:

Post测试结果:

总结

  1. http是建立在socket之上的数据结构化应用协议,可以通过拼socket包实现所有功能。
  2. 之后我们可以利用此接口实现一个核算地图的界面应用。

​想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com​​。

来源:51CTO开源基础软件社区内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯