自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

跟著小白一起學(xué)鴻蒙--]簡(jiǎn)單Http客戶端(十二)

系統(tǒng) OpenHarmony
HTTP 是一個(gè)基于 TCP/IP 通信協(xié)議來(lái)傳遞數(shù)據(jù)(HTML 文件、圖片文件、查詢結(jié)果等)。

??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??

??51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)??

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

在《#跟著小白一起學(xué)鴻蒙# [二] 第一個(gè)OpenHarmony程序》我們熟悉了如何在開(kāi)源鴻蒙開(kāi)發(fā)應(yīng)用,并通過(guò)hdc工具拷貝至開(kāi)發(fā)板運(yùn)行。但是那時(shí)候我們只是打印了最簡(jiǎn)單的hello world,接下來(lái)我們就講開(kāi)發(fā)最常用的部分,一個(gè)簡(jiǎn)單的http客戶端;

概述

  • HTTP 是一個(gè)基于 TCP/IP 通信協(xié)議來(lái)傳遞數(shù)據(jù)(HTML 文件、圖片文件、查詢結(jié)果等)。
  • HTTP是一個(gè)屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議,由于其簡(jiǎn)捷、快速的方式,適用于分布式超媒體信息系統(tǒng)。它于1990年提出,經(jīng)過(guò)幾年的使用與發(fā)展,得到不斷地完善和擴(kuò)展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規(guī)范化工作正在進(jìn)行之中,而且HTTP-NG(Next Generation of HTTP)的建議已經(jīng)提出。
  • HTTP協(xié)議工作于客戶端-服務(wù)端架構(gòu)為上。瀏覽器作為HTTP客戶端通過(guò)URL向HTTP服務(wù)端即WEB服務(wù)器發(fā)送所有請(qǐng)求。Web服務(wù)器根據(jù)接收到的請(qǐng)求后,向客戶端發(fā)送響應(yīng)信息。

HTTP請(qǐng)求消息Request

  • 請(qǐng)求數(shù)據(jù)結(jié)構(gòu)如下

#沖刺創(chuàng)作新星# #跟著小白一起學(xué)鴻蒙# [十二]簡(jiǎn)單Http客戶端-開(kāi)源基礎(chǔ)軟件社區(qū)

  • 一個(gè)Get的sample

在瀏覽器輸入www.baidu.com然后回車即可看到瀏覽器顯示了百度的頁(yè)面,按F12可以看到具體內(nèi)容:

#沖刺創(chuàng)作新星# #跟著小白一起學(xué)鴻蒙# [十二]簡(jiǎn)單Http客戶端-開(kāi)源基礎(chǔ)軟件社區(qū)

??上圖里我們可以看到在請(qǐng)求的url是www.baidu.com??,請(qǐng)求的方法是GET,服務(wù)器的IP地址是180.101.49.14:443(https,若是http就是80)。

  • 一個(gè)Post的sample

#沖刺創(chuàng)作新星# #跟著小白一起學(xué)鴻蒙# [十二]簡(jiǎn)單Http客戶端-開(kāi)源基礎(chǔ)軟件社區(qū)

  • 上圖里我們可以看到在請(qǐng)求的url是https://cysz.hopethink.com/qhhsd/app/getH5HsdList,請(qǐng)求的方法是POST,服務(wù)器的IP地址是114.215.124.251:443(https,若是http就是80),請(qǐng)求內(nèi)容類型application/x-www-form-urlencoded;charset=UTF-8,請(qǐng)求數(shù)據(jù)長(zhǎng)度84,請(qǐng)求數(shù)據(jù)keyword=&streetId=&pageNum=1&pageSize=1&ip=222.95.30.84。

此樣例參考小熊派設(shè)計(jì),使用小熊派HM_Micro開(kāi)發(fā)板進(jìn)行驗(yàn)證。

應(yīng)用開(kāi)發(fā)流程

graph LR
建立build.gn --> 建立helloworld.c --> 添加httpget --> 添加httppost --> 驗(yàn)證

建立Build.gn。

import("http://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 <stdio.h>
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;
//創(chuàng)建套接字
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);
//請(qǐng)求頭部?jī)?nèi)容
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);
//請(qǐng)求空行
strcat(str1, "\n\n");
//請(qǐng)求參數(shù)
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);
//請(qǐng)求頭部?jī)?nèi)容
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);
//請(qǐng)求空行
strcat(str1, "\n\n");
//str2的值為post的數(shù)據(jù)
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 <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <errno.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define IPSTR_GET "180.101.49.14" //服務(wù)器IP地址,上面查出來(lái)的;
#define IPSTR_POST "114.215.124.251"

#define PORT 80
#define BUF_SIZE 4096

  • 方法

httpget();
httppost();

測(cè)試結(jié)果:

Get測(cè)試結(jié)果:

Post測(cè)試結(jié)果:

總結(jié)

  1. http是建立在socket之上的數(shù)據(jù)結(jié)構(gòu)化應(yīng)用協(xié)議,可以通過(guò)拼socket包實(shí)現(xiàn)所有功能。
  2. 之后我們可以利用此接口實(shí)現(xiàn)一個(gè)核算地圖的界面應(yīng)用。

??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??

??51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)??

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

責(zé)任編輯:jianghua 來(lái)源: 51CTO開(kāi)源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2022-11-29 16:35:02

Tetris鴻蒙

2022-12-02 14:20:09

Tetris鴻蒙

2022-11-14 17:01:34

游戲開(kāi)發(fā)畫(huà)布功能

2023-03-30 09:32:27

2022-10-17 14:29:24

鴻蒙應(yīng)用開(kāi)發(fā)

2023-04-04 09:24:11

鴻蒙HiDumper

2022-10-10 14:47:04

藍(lán)牙應(yīng)用鴻蒙

2023-02-27 16:30:32

鴻蒙開(kāi)源協(xié)議分析

2022-08-19 19:02:20

開(kāi)源鴻蒙操作系統(tǒng)

2023-03-30 09:19:54

SELinux安全子系統(tǒng)

2023-01-03 15:09:10

鴻蒙常用工具

2022-11-24 14:34:41

Hap程序鴻蒙

2023-03-15 16:19:03

BinderIPC工具

2022-12-06 15:39:16

鴻蒙主干代碼

2022-10-20 16:40:16

JS應(yīng)用控制LED鴻蒙

2022-10-09 15:05:50

NAPI框架鴻蒙

2023-04-06 09:18:52

鴻蒙AVPlayerAVRecorder

2022-11-22 15:15:46

Wi-Fi鴻蒙

2022-12-05 15:02:14

鴻蒙用戶鑒權(quán)

2023-02-24 16:02:45

WebSocket網(wǎng)絡(luò)通訊協(xié)議
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)