C语言用awtk开发界面访问http接口

AWTK全称为Toolkit AnyWhere,是ZLG倾心打造的一套基于C语言开发的GUI框架。旨在为用户提供一个功能强大、高效可靠、简单易用、可轻松做出炫酷效果的GUI引擎,并支持跨平台同步开发,一次编程,终生使用。

1. 初识AWTK | AWStudio社区版

看官网介绍可以免费用,唯一麻烦的就是需要注册账户,给key默认可以绑定3台机器

https://awtk.zlg.cn/注册账户后下载开发工具 https://awtk.zlg.cn/awstudio/download.html

安装包有win和linux,其他平台可能需要源码安装,就在deepinlinux20.9环境试了一下

按照例子建了一个空工程,加了按钮能切换语言,能读写控件值(text label),顺便加一下通过curl访问http接口的实例吧

首先安装curl库
    sudo apt-get install libcurl4-openssl-dev
    引用头文件
    #include <curl/curl.h>
    在编译C/C++程序时,添加以下链接选项,默认库在 /usr/lib/x86_64-linux-gnu/libcurl.so.4.5.0
    -lcurl
    在awtk里是配置sconstruct,将so库放在本项目里,再awtk的ide里编译调试都可以了

CUSTOM_WIDGET_LIBS = [{"root" : '3rd/curl',     # 第三方库路径,支持绝对路径和相对路径。'shared_libs': ['curl'], # 引用的动态库名称,动态库文件必须放在 root/bin 目录下。'static_libs': []       # 引用的静态库名称,静态库文件必须放在 root/lib 目录下。}]

awtk的ide没有发布菜单,需要自己再工程根目录运行发布打包命令

python ./scripts/release.py

会将发布文件放到 ./release文件夹,这才是正规发布包内容

访问http接口一般返回json字符串,网上有c语言解析json

c操作json数据_json转为二进制c库-CSDN博客

本工程用awtk开发,可以用awtk自带的,更简洁

#include "conf_io/conf_json.h"tk_object_t* doc = conf_json_load("awtk1.json", TRUE);printf("isSuccess:%d\n", tk_object_get_prop_bool(doc, "isSuccess",TRUE));char buf[128]={0};sprintf(buf,"%s",tk_object_get_prop_str(doc, "data"));printf("data:%s\n", buf);widget_set_text_utf8(edit, buf);TK_OBJECT_UNREF(doc);

得到一个比较长字符串,为了方便显示,每10个字符加个空格显示

widget_t* target = WIDGET(e->target);char buf[128]={0};char newbuf[128]={0};widget_get_text_utf8(target, buf, sizeof(buf)-1);printf("data = %s\n", buf);int i,j,t;j=strlen(buf);if(j>30){t=0;for(i=0;i<j;i++){			if(i>0 && (0==(i%10))){newbuf[t]=' ';t++;}newbuf[t]=buf[i];t++;}printf("newbuf: %s \n",newbuf);widget_set_text_utf8(label, newbuf);}

最后也记录一下curl的2种get调用(直接保存成文件和回调保存到字符串)

#include <stdio.h>
#include <stdlib.h>
#include <curl/curl.h>
#include <string.h>
#include <unistd.h>
#include "conf_io/conf_json.h"
#include <ctype.h>
#define _XOPEN_SOURCE
#define __USE_XOPENstruct MemoryStruct {char *memory;size_t size;};
FILE *file;
widget_t* edit;
widget_t* label;
static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)
{ size_t realsize = size * nmemb;struct MemoryStruct *mem = (struct MemoryStruct*) userp;mem->memory = realloc(mem->memory, mem->size + realsize + 1);if (mem->memory == NULL) { /* out of memory! */ printf("not enough memory (realloc returned NULL)\n"); return 0; } memcpy(&(mem->memory[mem->size]), contents, realsize);mem->size += realsize;mem->memory[mem->size] = 0;printf("get size %ld\n %s \n",mem->size , mem->memory);file=fopen("awtk1.json","w");fputs(mem->memory,file);fclose(file);tk_object_t* doc = conf_json_load("awtk1.json", TRUE);printf("isSuccess:%d\n", tk_object_get_prop_bool(doc, "isSuccess",TRUE));char buf[128]={0};sprintf(buf,"%s",tk_object_get_prop_str(doc, "data"));printf("data:%s\n", buf);widget_set_text_utf8(edit, buf);TK_OBJECT_UNREF(doc);return realsize; 
}int httpsget(void) 
{ CURL *curl = NULL;CURLcode res;struct MemoryStruct chunk;chunk.memory = malloc(1); /* will be grown as needed by the realloc above */chunk.size = 0; /* no data at this point */curl_global_init(CURL_GLOBAL_ALL);/* get a curl handle */curl = curl_easy_init();if (!curl) {return -1;} /*设置easy handle属性*//* specify URL */curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET");curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.64.251:8080/api/jc5000/getVersion");/* Define our callback to get called when there's data to be written */curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);/* Set a pointer to our struct to pass to the callback */curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);/* set commom option */curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);/*执行数据请求*/res = curl_easy_perform(curl); if (res != CURLE_OK) {fprintf(stderr, "res=%d curl_easy_perform() failed: %s\n",res,curl_easy_strerror(res));} 
// 释放资源free(chunk.memory);curl_easy_cleanup(curl);curl_global_cleanup();return 0;
}int gethttptofile() {printf("Hello, gethttptofile!\n"); //1、curl全局初始化,初始化libcurl库(只能调用一次)//CURL_GLOBAL_ALL尽可能初始化一切(除了CURL_GLOBAL_ACK_EINTR)//CURL_GLOBAL_WIN32表示libcurl会初始化winsock库,如果失败则无法使用socket,windows系统专用//CURL_GLOBAL_SSL初始化SSL,(不初始化可能无法使用https)//CURL_GLOBAL_DEFAULT初始WIN32和SSL//CURL_GLOBAL_ACK_EINTR设置此标志后,curl将在连接或等待数据时确认EINTR条件。否则,curl会等待直到完全超时。(在7.30.0中添加)CURLcode init = curl_global_init(CURL_GLOBAL_ALL);if(init!=CURLE_OK){printf("curl全局初始化失败!\n");exit(1);} //2、初始化curl,返回CURL句柄CURL *curl = (struct CURL *)curl_easy_init();if(curl==NULL){printf("初始化CURL失败!\n");exit(1);} //3、设置option,各种curl参数的curl_easy_setopt(curl,CURLOPT_URL,"http://192.168.64.251:8080/test/getAppVersion");//设置保存位置,使用临时文件或保存到fopen中//FILE *file=fopen("awtk1.log","w");curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);//各option
//    1.CURLOPT_URL
//    设置访问URL
//    2.CURLOPT_WRITEFUNCTION,CURLOPT_WRITEDATA
//    通过设定一个回调函数,执行libcurl在接受到数据后用户想进行的操作,通常函数多做数据保存的功能,如处理下载文件。CURLOPT_WRITEDATA 用于表明CURLOPT_WRITEFUNCTION函数中的stream指针的来源,说白了就是设定回调函数的第四个参数的数据类型。回调函数原型为:size_t function( void *ptr, size_t size, size_t nmemb, void *stream);
//    3.CURLOPT_HEADERFUNCTION,CURLOPT_HEADERDATA
//    通过设定一个回调函数,执行libcurl在接受到http头数据后用户想进行的操作。CURLOPT_WRITEDATA 传递指针给libcurl,该指针表明CURLOPT_HEADERFUNCTION 函数的stream指针的来源。回调函数原型为 size_t function( void *ptr, size_t size,size_t nmemb, void *stream);
//    4.CURLOPT_READFUNCTION CURLOPT_READDATA
//    libCurl需要读取数据传递给远程主机时将调用CURLOPT_READFUNCTION指定的函数,函数原型是:size_t function(void *ptr, size_t size, size_t nmemb,void *stream). CURLOPT_READDATA 表明CURLOPT_READFUNCTION函数原型中的stream指针来源,说白了就是设定回调函数的第四个参数的数据类型。
//    5.CURLOPT_NOPROGRESS,CURLOPT_PROGRESSFUNCTION,CURLOPT_PROGRESSDATA
//    跟数据传输进度相关的参数。CURLOPT_PROGRESSFUNCTION 指定的函数正常情况下每秒被libcurl调用一次,为了使CURLOPT_PROGRESSFUNCTION被调 用,CURLOPT_NOPROGRESS必须被设置为false,CURLOPT_PROGRESSDATA指定的参数将作为 CURLOPT_PROGRESSFUNCTION指定函数的第一个参数
//    6.CURLOPT_TIMEOUT,CURLOPT_CONNECTIONTIMEOUT:
//    CURLOPT_TIMEOUT 用于设置传输时间,CURLOPT_CONNECTIONTIMEOUT 设置连接等待时间
//    7.CURLOPT_FOLLOWLOCATION
//    设置重定位URL
//    CURLOPT_RANGE: CURLOPT_RESUME_FROM:
//    断点续传相关设置。CURLOPT_RANGE 指定char *参数传递给libcurl,用于指明http域的RANGE头域,例如:
//    表示头500个字节:bytes=0-499
//    表示第二个500字节:bytes=500-999
//    表示最后500个字节:bytes=-500
//    表示500字节以后的范围:bytes=500-
//                       第一个和最后一个字节:bytes=0-0,-1
//    同时指定几个范围:bytes=500-600,601-999
//    CURLOPT_RESUME_FROM 传递一个long参数给libcurl,指定你希望开始传递的偏移量。
//    8.CURLOPT_UPLOAD:
//    如果第三个参数被设置为1的话,就是让libcurl做好上传的准备。如果传输协议是http的话,uoload就是发送put。
//    9. CURLOPT_SSL_VERIFYPEER:
//    第三个参数的缺省值为1.该函数多用于设定curl忽略对网站证书的检查(不管忽略不忽略,curl都是检查的)。
//    10.CURLOPT_VERBOSE
//    相当厉害的一个参数,可以向控制台(默认)输出curl接受和发送的数据,输出流可以重定向。
//    11.CURLOPT_HTTPGET
//    将curl向服务器交互数据的方式改变为get //4、执行curl的各种操作的请求CURLcode curLcode = curl_easy_perform(curl);if(curLcode!=CURLE_OK){printf("curl请求失败:%d!\n",curLcode);exit(1);}
//    perform错误码说明:
//    1.CURLE_OK
//    任务完成一切都好
//    2.CURLE_UNSUPPORTED_PROTOCOL
//    不支持的协议,由URL的头部指定
//    3.CURLE_COULDNT_CONNECT
//    不能连接到remote 主机或者代理
//    4.CURLE_REMOTE_ACCESS_DENIED
//    访问被拒绝
//    5.CURLE_HTTP_RETURNED_ERROR
//    Http返回错误
//    6.CURLE_READ_ERROR
//    读本地文件错误 //5、读取请求响应的信息long totalTime;curLcode=curl_easy_getinfo(curl,CURLINFO_TOTAL_TIME,&totalTime);if(curLcode!=CURLE_OK){printf("curl获取信息失败:%d!\n",curLcode);}printf("CURLINFO_TOTAL_TIME:%ld!\n",totalTime);
//    getinfo参数
//    CURLINFO_EFFECTIVE_URL - 最后一个有效的URL地址
//    CURLINFO_HTTP_CODE - 最后一个收到的HTTP代码
//    CURLINFO_FILETIME - 远程获取文档的时间,如果无法获取,则返回值为“-1”
//    CURLINFO_TOTAL_TIME - 最后一次传输所消耗的时间
//    CURLINFO_NAMELOOKUP_TIME - 名称解析所消耗的时间
//    CURLINFO_CONNECT_TIME - 建立连接所消耗的时间
//    CURLINFO_PRETRANSFER_TIME - 从建立连接到准备传输所使用的时间
//    CURLINFO_STARTTRANSFER_TIME - 从建立连接到传输开始所使用的时间
//    CURLINFO_REDIRECT_TIME - 在事务传输开始前重定向所使用的时间
//    CURLINFO_SIZE_UPLOAD - 以字节为单位返回上传数据量的总值
//    CURLINFO_SIZE_DOWNLOAD - 以字节为单位返回下载数据量的总值
//    CURLINFO_SPEED_DOWNLOAD - 平均下载速度
//    CURLINFO_SPEED_UPLOAD - 平均上传速度
//    CURLINFO_HEADER_SIZE - header部分的大小
//    CURLINFO_HEADER_OUT - 发送请求的字符串
//    CURLINFO_REQUEST_SIZE - 在HTTP请求中有问题的请求的大小
//    CURLINFO_SSL_VERIFYRESULT - 通过设置CURLOPT_SSL_VERIFYPEER返回的SSL证书验证请求的结果
//    CURLINFO_CONTENT_LENGTH_DOWNLOAD - 从Content-Length: field中读取的下载内容长度
//    CURLINFO_CONTENT_LENGTH_UPLOAD - 上传内容大小的说明
//    CURLINFO_CONTENT_TYPE - 下载内容的Content-Type:值,NULL表示服务器没有发送有效的Content-Type:header//6、清理curl句柄curl_easy_cleanup(curl);//7、清理全局配置(只能调用一次)curl_global_cleanup();fclose(file); file=fopen("awtk1.log","r");//8、操作文件内容//流指针移动到末尾fseek(file,0,SEEK_END);//返回当前流指针位置const long i = ftell(file);printf("文件长度:%ld!\n",i);//计算完毕记得把流指针归位rewind(file);//申请一块能装下整个文件内容的内存区域char *a = (char *) malloc(i);//fgets(a, i+1,file);fread(a, 1,i,file);printf("当前文件内容:%s \n",a); //记得释放申请的内存区域free(a);//关闭临时文件fclose(file); return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/116509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react中hooks闭包

import React, { useState } from react;function Counter() {const [count, setCount] useState(0);return (<div><p>Count: {count}</p><button onClick{() > setCount(count 1)}>Increment</button></div>); }在上面的 React 组件…

常见的Elasticsearch操作

在Elasticsearch中&#xff0c;增删改查操作具有明显的标识&#xff0c;通常使用HTTP方法和URI来表示不同的操作类型。以下是一些常见的Elasticsearch操作及其标识&#xff1a; 增&#xff08;Create/Index&#xff09;&#xff1a; HTTP方法&#xff1a; 通常使用PUT或POST方法…

2023年中国调速器产量、销量及市场规模分析[图]

调速器行业是指生产、销售和维修各种调速器设备的行业。调速器是一种能够改变机械传动系统输出转速的装置&#xff0c;通过调整输入和输出的转速比来实现转速调节的功能。 调速器行业分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; 随着工业自动化程度…

CentOS | 添加普通用户并授权sudo

sudo -i adduser peter passwd peter whereis sudoers nano /etc/sudoers添加一行新用户到root组 ## Allow root to run any commands anywhere root ALL(ALL) ALL peter ALL(ALL) ALL如果提升权限后无法cd到其他目录等&#xff0c;修改 /etc/passwd 文件&…

海外跨境商城电商源码-进出口电商平台网站-多语言多商户多货币平台

一、海外跨境商城电商源码简介 海外跨境电商已成为全球经济发展的重要推动力。而海外跨境商城电商源码则是实现全球化电商的关键工具。本文将详细介绍海外跨境商城电商源码及其相关内容。 二、如何理解海外跨境商城电商源码 海外跨境商城电商源码是指一套已经开发好并可直接应用…

ZKP6.2 Discrete-log-based Polynomial Commitments (KZG10)

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 6: Discrete-log-based Polynomial Commitments (Yupeng Zhang) 6.2 KZG polynomial commitment and its variants KZG: [Kate-Zaverucha-Goldberg 2010]Procedure Soundness: q-Strong Bilinear Diffie-Hellman (q-SBDH) a…

致敬技术与创新·20231024程序员节

每年的10月24日&#xff0c;全球的程序员们都会欢庆属于他们的节日——1024程序员节。这个节日旨在致敬那些用代码改变世界的程序员们&#xff0c;以及他们对于技术创新的执着追求。在这一天&#xff0c;让我们一起来了解这个节日的由来、意义&#xff0c;以及如何庆祝这个特殊…

MySQL MVCC机制探秘:数据一致性与并发处理的完美结合,助你成为数据库高手

一、前言 在分析 MVCC 的原理之前&#xff0c;我们先回顾一下 MySQL 的一些内容以及关于 MVCC 的一些简单介绍。&#xff08;注:下面没有特别说明默认 MySQL 的引擎为 InnoDB &#xff09; 1.1 数据库的并发场景 数据库并发场景有三种&#xff0c;分别是&#xff1a; 读-读…

竞赛选题 深度学习人脸表情识别算法 - opencv python 机器视觉

文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习人脸表情识别系…

算法学习(三)利用前序遍历的思想求解层序遍历

给定一个二叉树&#xff0c;返回该二叉树层序遍历的结果&#xff0c;&#xff08;从左到右&#xff0c;一层一层地遍历&#xff09; 例如&#xff1a; 给定的二叉树是{3,9,20,#,#,15,7}, 我的解法&#xff1a; 在前序遍历的基础上&#xff0c;增加一个深度参数&#xff0c;结果…

rapidocr_paddle[gpu]:GPU端推理库来了

简介 rapidocr_paddle系列包是基于PaddlePaddle框架作为推理引擎的&#xff0c;支持CPU和GPU上推理。值得说明的是&#xff0c;这个包和PaddleOCR相比&#xff0c;代码基本都是一样的&#xff0c;只不过这个库将里面核心推理代码抽了出来&#xff0c;更加精简而已。 推荐GPU上…

《java核心卷Ⅰ》知识点总结(可作面试题)

&#x1f6eb; JDK和JRE傻傻分不清?&#x1f6eb; HelloWorld的输出都经历了啥&#xff1f;&#x1f6eb; Java的三个版本都是啥&#xff1f;&#x1f6eb; 关于main方法你都知道啥&#xff1f;main方法被声明为private会怎样&#xff1f;&#x1f6eb; 强制and自动类型转换都…

8.1 矢量图层符号化整体说明

文章目录 前言符号化与图层渲染符号符号层渲染器 总结 前言 地图制图是QGIS的优势所在&#xff0c;QGIS包含完整的地图制图功能&#xff0c;如标注与注记、符号化与地图综合等多种功能。 符号化&#xff08;Symbolization&#xff09;是指利用符号将地理事物或现象抽象化。 QGi…

强化学习代码实战---多臂赌博机---AttributeError: ‘EntryPoints‘ object has no attribute ‘get‘

1.问题 配置window10&#xff0c;python3.7&#xff0c;tensorflow1.14.0&#xff0c;运行第一节多臂赌博机代码时遇到AttributeError: ‘EntryPoints‘ object has no attribute ‘get‘。 2.解决 执行以下代码&#xff1a; pip install frozenlist1.3.1 geopy2.2.0 humanize…

小知识(5) el-table行样式失效问题

一、实现效果 子级呈现不同颜色去区分 二、最初代码 tips: 我这里使用的vue3 elementplus <el-table :row-class-name"tableRowClassName" >... </el-table>function tableRowClassName({ row, rowIndex }) {if (row.children.length 0) {return …

Java面试题:链表-反转链表

问题描述 给定一个单链表的头结点pHead(该头节点是有值的&#xff0c;比如在下图&#xff0c;它的val是1)&#xff0c;长度为n&#xff0c;反转该链表后&#xff0c;返回新链表的表头。 如当输入链表{1,2,3}时&#xff0c;经反转后&#xff0c;原链表变为{3,2,1}&#xff0c;…

Django 地址接口开发

应用 Mixin 混合类进行收货地址接口开发 python ../manage.py startapp address继承了mixins扩展类&#xff0c;进到里面可以稍微看下源码 该方法帮我们实现了获取验证及保存的功能 address/views from rest_framework.generics import GenericAPIView from rest_framewo…

移动端滚动穿透与滚动溢出解决方案

滚动穿透 问题描述 在移动端 WEB 开发的时候&#xff08;小程序也雷同&#xff09;&#xff0c;如上录屏所示&#xff0c;如果页面超过一屏高度出现滚动条时&#xff0c;在 fixed 定位的弹窗遮罩层上进行滑动&#xff0c;它下面的内容也会跟着一起滚动&#xff0c;看起来好像事…

PC连wifi,网线连接旭日X3派以共享网络

PC电脑连好wifi&#xff0c;找到【控制面板->网络和Internet->网络和共享中心->查看网络状态和任务->更改适配器设置】 找到WLAN&#xff0c;右键【属性->共享】勾上允许&#xff0c;然后【确定】。 现在去与PC通过网线连接好的X3派上配置&#xff1a; 参考&a…

SAP MM学习笔记38 - 入库/请求自动决济(ERS - Evaluated Receipt Settlement)

之前的章节学习了请求书的方方面面&#xff0c;这一章来个终章&#xff0c;入库/请求自动决济&#xff1a;&#xff09;。 1&#xff0c;什么是 ERS ERS&#xff0c;即 入库/请求自动决济&#xff0c;是 自動決済&#xff08;Automatic Settlement&#xff09;功能的一种。 以…