C语言通过IXMLHTTPRequest以get或post方式发送http请求获取服务器文本或xml数据

做过网页设计的人应该都知道ajax。
Ajax即Asynchronous Javascript And XML(异步的JavaScript和XML)。使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变的信息。
在IE浏览器中,Ajax技术就是基于JavaScript里面的XMLHTTPRequest。AJAX通过XMLHttpRequest对象发出HTTP 请求,得到服务器返回的数据后,再进行处理。现在,服务器返回的都是JSON格式的数据,XML格式已经过时了,但是AJAX这个名字已经成了一个通用名词,字面含义已经消失了。
XMLHttpRequest对象是AJAX的主要接口,用于浏览器与服务器之间的通信。尽管名字里面有XML和Http,它实际上可以使用多种协议(比如file或ftp),发送任何格式的数据(包括字符串和二进制)。

其实,不仅在网页上能用JavaScript语言调用XMLHTTPRequest组件,在桌面窗口程序里面也可以用C语言或C++调用XMLHTTPRequest组件。
XMLHTTPRequest是微软msxml6.0里面的组件。msxml6.0可直接解析服务器返回的xml文档,但json数据需要在网上找cJSON库来解析。

首先我们要在自己的服务器上准备好处理ajax请求的页面,本文准备了三个示例页面:str_test.php、json_test.php和xml_test.php,分别用来产生文本回应、json回应和xml回应。xml_test.php页面支持get和post两种ajax请求方式。

PHP文件用UTF-8编码保存,但C文件要用GB2312编码保存。
这是因为在微软的简体中文Windows系统里面,以A结尾的API函数(如CreateWindowA)采用的是GB2312编码的char *字符串,以W结尾的API函数(如CreateWindowW)采用的是UTF-16编码的wchar_t *字符串,COM组件使用的BSTR字符串是在wchar_t *字符串的基础上增加了4字节的字符串长度前缀。
IXMLHttpRequest组件(一种COM组件)工作时使用的是UTF-16编码的BSTR字符串。
我们在收到IXMLHttpRequest组件提供的UTF-16编码的BSTR字符串后,如果想要用printf在控制台上打印出来,就需要用convert_bstr_to_string函数将BSTR转换为GB2312编码的char *字符串。想要直接打印BSTR字符串不能用printf函数,要用WriteConsoleW函数才行。如果是显示在窗口的文本框或者窗口的标题栏上那就简单了,直接用SetWindowTextW或SetDlgItemTextW函数,把BSTR字符串传进去就行了。
同样,在给IXMLHttpRequest组件传递字符串参数时,需要先用convert_string_to_bstr函数将GB2312编码的char *字符串转换为UTF-16编码的带长度前缀的BSTR字符串。
如果是写入txt文本文件的话,我们就可以采用UTF-8编码,用MultiByteToWideChar函数(CP_UTF8)将BSTR转换成UTF-8编码的char *字符串,再用fprintf或fwrite写入txt文件。

str_test.php:

<?php header('Content-type: text/html; charset=utf-8'); ?>
当前时间为<?=date("Y年n月j日 H:i:s")?>。

 json_test.php:

<?php
header('Content-type: application/json');
header('Pragma: no-cache');
header('Cache-control: no-cache');
header('Expires: 0');$arr = array();
$arr["date"] = date("Y-n-j H:i:s");
$arr["time"] = time();
$arr["desc"] = "abcd简体中文";
echo json_encode($arr);
?>

xml_test.php:

<?php
header('Content-type: text/xml');session_start();
header('Pragma: no-cache');
header('Cache-control: no-cache');
header('Expires: 0');echo '<?xml version="1.0" encoding="utf-8"?>';
$timestr = strftime("%Y%m%d%H%M%S");
echo "<test timestr=\"$timestr\" example=\"简体中文\">";
foreach ($_COOKIE as $name => $value) {$_name = htmlspecialchars($name);$_value = htmlspecialchars($value);echo "<cookie name=\"$_name\">$_value</cookie>";
}
foreach ($_GET as $name => $value) {$_name = htmlspecialchars($name);$_value = htmlspecialchars($value);echo "<param method=\"get\" name=\"$_name\">$_value</param>";
}
foreach ($_POST as $name => $value) {$_name = htmlspecialchars($name);$_value = htmlspecialchars($value);echo "<param method=\"post\" name=\"$_name\">$_value</param>";
}
echo '</test>';
?>

下面我们来看看C语言如何像网页里面那样用XMLHTTPRequest发送ajax请求。

/* 这个程序只能在C编译器下编译成功, 请确保源文件的扩展名为c */
#define COBJMACROS
#include <stdio.h>
#include <MsXml6.h>#pragma comment(lib, "msxml6.lib")// char *转BSTR
// 用完后调用SysFreeString释放
BSTR convert_string_to_bstr(const char *s)
{int n;wchar_t *ws;BSTR bstr = NULL;n = MultiByteToWideChar(CP_ACP, 0, s, -1, NULL, 0);ws = malloc(n * sizeof(wchar_t));if (ws != NULL){MultiByteToWideChar(CP_ACP, 0, s, -1, ws, n);bstr = SysAllocString(ws);free(ws);}return bstr;
}// BSTR转char *
// 用完后调用free释放
char *convert_bstr_to_string(BSTR bstr)
{char *s;int n;n = WideCharToMultiByte(CP_ACP, 0, bstr, -1, NULL, 0, NULL, NULL);s = malloc(n);if (s != NULL)WideCharToMultiByte(CP_ACP, 0, bstr, -1, s, n, NULL, NULL);return s;
}// 去掉字符串末尾的\r\n
void remove_last_crlf(char *str)
{int len;len = (int)strlen(str);if (len >= 2 && str[len - 2] == '\r' && str[len - 1] == '\n')str[len - 2] = '\0';
}// 示例: 读取纯文本内容 (同步方式)
void str_test(const char *url)
{char *response;long status;BSTR method_bstr, url_bstr, response_bstr;HRESULT hr;IXMLHTTPRequest *xhr;VARIANT async; // VARIANT代表一个弱类型的变量VARIANT null;hr = CoCreateInstance(&CLSID_XMLHTTPRequest, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLHTTPRequest, &xhr);if (SUCCEEDED(hr)){// 打开连接// get参数内容是放到url字符串里面的method_bstr = convert_string_to_bstr("GET");url_bstr = convert_string_to_bstr(url);async.vt = VT_BOOL;async.boolVal = VARIANT_FALSE; // 选择非异步方式 (也就是同步方式)null.vt = VT_NULL;hr = IXMLHttpRequest_open(xhr, method_bstr, url_bstr, async, null, null); // 最后两个参数是用户名和密码, 不用填SysFreeString(method_bstr);SysFreeString(url_bstr);if (SUCCEEDED(hr))printf("open() succeeded\n");// 发送请求// 由于我们选择的是同步方式, 所以send函数要等到所有数据都接收完了才返回hr = IXMLHttpRequest_send(xhr, null); // 第二个参数是post数据内容, 不用管if (SUCCEEDED(hr))printf("send() succeeded\n");// 获取请求状态// 0: open函数还没调用// 1: send函数还没调用// 2: send函数调用了, get_status()函数已经可以使用了, 也可以读http headers了, 但是还读不了response// 3: 已收到了部分数据, 可以读responseBody和responseText// 4: 所有数据都已经接收完了, responseBody和responseText已经是完整数据了hr = IXMLHttpRequest_get_readyState(xhr, &status);if (SUCCEEDED(hr))printf("ready state: %d\n", status);// 获取http返回的response codehr = IXMLHttpRequest_get_status(xhr, &status);if (SUCCEEDED(hr))printf("http status code: %d\n", status);// 读取并显示文本内容hr = IXMLHTTPRequest_get_responseText(xhr, &response_bstr);if (SUCCEEDED(hr)){// response_bstr是utf16编码, 转换后的response是gb2312编码// 把函数里面的CP_ACP改成CP_UTF8就可以转成utf8编码, 但是utf8就没办法用printf打印, 只能用fwrite写入txt文件再用记事本打开查看response = convert_bstr_to_string(response_bstr);remove_last_crlf(response);printf("response: %s\n", response);free(response);SysFreeString(response_bstr);}IXMLHttpRequest_Release(xhr);}printf("\n");
}// 直接显示xml代码
void display_xmlstr(IXMLDOMDocument *xmldoc)
{char *str;BSTR bstr;HRESULT hr;hr = IXMLDOMDocument_get_xml(xmldoc, &bstr);if (SUCCEEDED(hr)){str = convert_bstr_to_string(bstr);remove_last_crlf(str);printf("xmlstr: %s\n", str);free(str);SysFreeString(bstr);}
}// 显示xml属性值
void display_attr(IXMLDOMElement *elem, const char *name)
{char *value;BSTR bstr; // 表示一个带长度前缀的utf16编码的字符串VARIANT variant; // 表示一个弱类型的变量bstr = convert_string_to_bstr(name);IXMLDOMElement_getAttribute(elem, bstr, &variant);SysFreeString(bstr); // 使用完字符串后必须释放if (variant.vt == VT_BSTR){value = convert_bstr_to_string(variant.bstrVal);printf("%s: %s\n", name, value);free(value);SysFreeString(variant.bstrVal); // 保存在Variant中的BSTR也必须释放掉}else if (variant.vt == VT_NULL)printf("%s: (null)\n", name);
}// 检查xml节点名称是否为指定名称
int check_node_name(IXMLDOMNode *node, const char *expected_name)
{char *name;int ret;BSTR bstr;IXMLDOMNode_get_nodeName(node, &bstr);name = convert_bstr_to_string(bstr);SysFreeString(bstr);ret = (strcmp(name, expected_name) == 0);free(name);return ret;
}// 检查xml属性值是否为指定值
int check_node_attr(IXMLDOMNode *node, const char *attr, const char *expected_value)
{char *value;int ret = 0;BSTR bstr;HRESULT hr;IXMLDOMElement *elem;VARIANT variant;IXMLDOMNode_QueryInterface(node, &IID_IXMLDOMElement, &elem); // 先把node转成elementbstr = convert_string_to_bstr(attr);hr = IXMLDOMElement_getAttribute(elem, bstr, &variant); // 再通过element获取属性值SysFreeString(bstr);if (SUCCEEDED(hr)){if (variant.vt == VT_BSTR){value = convert_bstr_to_string(variant.bstrVal);ret = (strcmp(value, expected_value) == 0);SysFreeString(variant.bstrVal);free(value);}else if (variant.vt == VT_NULL)ret = (expected_value == NULL || expected_value[0] == '\0');}IXMLDOMElement_Release(elem);return ret;
}void display_xml(IXMLDOMDocument *xmldoc)
{char *text;long i, len;BSTR text_bstr;HRESULT hr;IXMLDOMElement *root;IXMLDOMNode *node;IXMLDOMNodeList *list;IXMLDOMDocument_get_documentElement(xmldoc, &root);display_attr(root, "timestr");display_attr(root, "example");display_attr(root, "title");hr = IXMLDOMElement_get_childNodes(root, &list);if (SUCCEEDED(hr)){IXMLDOMNodeList_get_length(list, &len);for (i = 0; i < len; i++){IXMLDOMNodeList_get_item(list, i, &node);if (check_node_name(node, "param") && check_node_attr(node, "method", "get") && check_node_attr(node, "name", "txt")){IXMLDOMNode_get_text(node, &text_bstr);text = convert_bstr_to_string(text_bstr);printf("txt: %s\n", text);free(text);SysFreeString(text_bstr);}else if (check_node_name(node, "param") && check_node_attr(node, "method", "post") && check_node_attr(node, "name", "hello")){IXMLDOMNode_get_text(node, &text_bstr);text = convert_bstr_to_string(text_bstr);printf("hello: %s\n", text);free(text);SysFreeString(text_bstr);}IXMLDOMNode_Release(node);}IXMLDOMNodeList_Release(list);}IXMLDOMElement_Release(root);
}// 示例: 读取xml内容 (同步方式)
void xml_test(const char *url, const char *post_data)
{long status;BSTR method_bstr, url_bstr, header_bstr, value_bstr;HRESULT hr;IDispatch *disp;IXMLDOMDocument *xmldoc;IXMLHTTPRequest *xhr;VARIANT async;VARIANT body;VARIANT null;hr = CoCreateInstance(&CLSID_XMLHTTPRequest, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLHTTPRequest, &xhr);if (SUCCEEDED(hr)){if (post_data == NULL)method_bstr = convert_string_to_bstr("GET");elsemethod_bstr = convert_string_to_bstr("POST");printf("method: %ls\n", method_bstr); // 不带中文的BSTR可直接用%ls输出, 带中文就不行了url_bstr = convert_string_to_bstr(url);async.vt = VT_BOOL;async.boolVal = VARIANT_FALSE;null.vt = VT_NULL;hr = IXMLHttpRequest_open(xhr, method_bstr, url_bstr, async, null, null);SysFreeString(method_bstr);SysFreeString(url_bstr);if (SUCCEEDED(hr))printf("open() succeeded\n");if (post_data == NULL)body = null;else{header_bstr = convert_string_to_bstr("Content-Type");value_bstr = convert_string_to_bstr("application/x-www-form-urlencoded");IXMLHttpRequest_setRequestHeader(xhr, header_bstr, value_bstr);SysFreeString(header_bstr);SysFreeString(value_bstr);body.vt = VT_BSTR;body.bstrVal = convert_string_to_bstr(post_data);}hr = IXMLHttpRequest_send(xhr, body);if (SUCCEEDED(hr))printf("send() succeeded\n");if (body.vt == VT_BSTR){SysFreeString(body.bstrVal);body = null;}hr = IXMLHttpRequest_get_readyState(xhr, &status);if (SUCCEEDED(hr))printf("ready state: %d\n", status);hr = IXMLHttpRequest_get_status(xhr, &status);if (SUCCEEDED(hr))printf("http status code: %d\n", status);hr = IXMLHTTPRequest_get_responseXML(xhr, &disp);if (SUCCEEDED(hr)){printf("get_responseXML() succeeded\n");hr = IDispatch_QueryInterface(disp, &IID_IXMLDOMDocument, &xmldoc);if (SUCCEEDED(hr)){printf("IDispatch_QueryInterface() succeeded\n");display_xmlstr(xmldoc);display_xml(xmldoc);IXMLDOMDocument_Release(xmldoc);}elseprintf("IDispatch_QueryInterface() failed\n");IDispatch_Release(disp);}elseprintf("get_responseXML() failed");IXMLHttpRequest_Release(xhr);}printf("\n");
}int main()
{CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); // 初始化COM组件对象模型str_test("http://adv.purasbar.com/mcu/test/str_test.php");str_test("http://adv.purasbar.com/mcu/test/json_test.php");xml_test("http://adv.purasbar.com/mcu/test/xml_test.php?txt=xp%E7%B3%BB%E7%BB%9F%E4%B8%8B%E8%BD%BD&yaya=%E5%96%9D%E5%AE%8C%E8%8D%AF%E6%84%9F%E8%A7%89%E6%B8%85%E7%88%BD%E4%BA%86%E8%AE%B8%E5%A4%9A", NULL); // get方式xml_test("http://adv.purasbar.com/mcu/test/xml_test.php?txt=xp%E7%B3%BB%E7%BB%9F%E4%B8%8B%E8%BD%BD", "hello=%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83%E5%90%8E%E5%8F%B0%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F&yaya=%E9%9B%BE%E9%9B%A8%20%E8%BF%9E%E9%98%B4%E5%A4%A9%20%E7%BE%BD%E7%BE%BD%20%E6%B5%85%E6%B5%85%E5%81%A5%E5%81%A5%E5%BA%B7%E5%BA%B7%20%E9%BB%9B%E8%A1%8D%20%E9%9F%B3%E9%9F%B3%E9%94%A6%E9%B2%A4%E9%99%84"); // post方式CoUninitialize();return 0;
}

get参数的提交方法:
将参数直接附加到URL网址的后面。如http://XXX//xml_test.php?A=B&C=D&E=F。汉字和符号必须用urlencode函数编码成%XX的形式。
post数据的提交方法:
通过VARIANT弱类型变量传入IXMLHttpRequest_send函数的第二个参数。没有post数据时要传入VT_NULL值。
汉字和符号同样也必须用urlencode函数编码成%XX的形式。只是最前面不需要以问号开头。

关于urlencode/urldecode、htmlspecialchars、trim和str_replace函数的C语言实现,请参考这篇文章:

https://blog.csdn.net/ZLK1214/article/details/131748124icon-default.png?t=N7T8https://blog.csdn.net/ZLK1214/article/details/131748124

程序运行结果:

open() succeeded
send() succeeded
ready state: 4
http status code: 200
response: 当前时间为2024年1月24日 20:37:39。open() succeeded
send() succeeded
ready state: 4
http status code: 200
response: {"date":"2024-1-24 20:37:40","time":1706099860,"desc":"abcd\u7b80\u4f5
3\u4e2d\u6587"}method: GET
open() succeeded
send() succeeded
ready state: 4
http status code: 200
get_responseXML() succeeded
IDispatch_QueryInterface() succeeded
xmlstr: <?xml version="1.0"?>
<test timestr="20240124203740" example="简体中文"><param method="get" name="txt"
>xp系统下载</param><param method="get" name="yaya">喝完药感觉清爽了许多</param><
/test>
timestr: 20240124203740
example: 简体中文
title: (null)
txt: xp系统下载method: POST
open() succeeded
send() succeeded
ready state: 4
http status code: 200
get_responseXML() succeeded
IDispatch_QueryInterface() succeeded
xmlstr: <?xml version="1.0"?>
<test timestr="20240124203740" example="简体中文"><cookie name="PHPSESSID">ktvth
t5ebhkssu0k5srknmpic3</cookie><param method="get" name="txt">xp系统下载</param><
param method="post" name="hello">测试环境后台管理系统</param><param method="post
" name="yaya">雾雨 连阴天 羽羽 浅浅健健康康 黛衍 音音锦鲤附</param></test>
timestr: 20240124203740
example: 简体中文
title: (null)
txt: xp系统下载
hello: 测试环境后台管理系统请按任意键继续. . .

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

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

相关文章

手撕重采样,考虑C的实现方式

一、参考文章&#xff1a; 重采样、上采样、下采样 - 知乎 (zhihu.com) 先直接给结论&#xff0c;正常重采样过程如下&#xff1a; 1、对于原采样率fs&#xff0c;需要重采样到fs1&#xff0c;一般fs和fs1都是整数哈&#xff0c;则先找fs和fs1的最小公倍数&#xff0c;设为m…

libjsoncpp 的编译和交叉编译

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

开通商家转账到零钱技巧

商家转账到零钱是什么&#xff1f; 通过商家转账到零钱这个功能&#xff0c;如果我们系统需要对用户支付费用&#xff0c;比如发放佣金、提成、退款之类的&#xff0c;可以直接转账到用户的微信零钱。 【商家转账到零钱】是【企业付款到零钱】的升级版&#xff0c;2022年5月1…

H264解码原理详解

H.264的编码原理参考文章H.264的编码原理 解码原理 解码器负责将符合H.264码流规范的压缩视频流解码&#xff0c;并进行图像重建。 根据如下图所示的解码器流图&#xff0c;我们可以看出基本的解码流程如下&#xff1a;解码器从网络提取层中接收压缩的比特流&#xff0c;经过…

Mysql复习1--理论基础+操作实践--更新中

Mysql 索引索引的分类索引失效sql优化 删除数据库数据恢复 索引InnoDB引擎MyISAM引擎Memory引擎Btree索引支持支持支持hash索引不支持不支持支持R-tree索引不支持支持不支持Full-text索引5.6版本以后支持支持不支持 索引 解释说明: 索引指的是帮助mysql高效的获取数据的结构叫…

《Windows核心编程》若干知识点实战应用分享

目录 1、进程的虚拟内存分区与小于0x10000的小地址内存区 1.1、进程的虚拟内存分区 1.2、小于0x10000的小地址内存区 2、保存线程上下文的CONTEXT结构体 3、从汇编代码角度去理解多线程运行过程的典型实例 4、调用TerminateThread强制结束线程会导致线程中的资源没有释放…

Redisson 分布式锁可重入的原理

目录 1. 使用 Redis 实现分布式锁存在的问题 2. Redisson 的分布式锁解决不可重入问题的原理 1. 使用 Redis 实现分布式锁存在的问题 不可重入&#xff1a;同一个线程无法两次 / 多次获取锁举例 method1 执行需要获取锁method2 执行也需要&#xff08;同一把&#xff09;锁如…

Python map函数

在Python编程中&#xff0c;map()函数是一个强大的工具&#xff0c;用于将函数应用于可迭代对象&#xff08;如列表、元组等&#xff09;的每个元素&#xff0c;然后返回一个新的可迭代对象&#xff0c;其中包含应用函数后的结果。本文将深入探讨map()函数的用法&#xff0c;提…

云计算项目五:部署数据库服务mysql |部署共享存储服务NFS | 配置网站服务

部署数据库服务mysql |部署共享存储服务NFS | 配置网站服务 案例1:配置逻辑卷步骤一:创建LV步骤二:格式化案例2:配置数据库服务器步骤一:安装软件MySQL服务软件(2台数据库服务器都要安装)步骤二:挂载lv设备步骤三:启动服务步骤四:管理员登录案例3:配置主从同步步骤一…

linuxshell日常脚本命令之if判断

shell脚本if中判断大于、小于、等于、不等于的符号 脚本有问题&#xff0c;有没有哪位大佬能帮忙检查一下&#xff1f; #!/bin/bash#run_num$(squeue | grep shifting | wc -l) run_numsqueue | grep shifting | wc -l #run_num$(squeue | grep shifting | wc -l 2>&1…

vue+draggable+el-upload上传图片拖拽重排方法

vuedraggableel-upload上传图片拖拽重排方法 1.html <el-row><el-col><el-form-item label"添加视频/图片" prop"device_id"><div class"image-upload"><draggable v-model"fileList" update"dataDr…

js树形控件zTree使用总结

文章目录 一、zTree简介1.1、zTree的特点1.2、zTree文件介绍 二、zTree的基本使用2.1、zTree的创建2.2、zTree的配置2.3、zTree的数据格式2.3.1、标准数据格式2.3.2、简单数据格式 2.4、zTree的常用方法2.4.1、获取zTree对象2.4.2、增加节点2.4.3、勾选或取消勾选全部节点2.4.4…

视频汇聚/云存储平台EasyCVR级联上级播放后一直发流是什么原因?

可视化云监控平台/安防视频监控系统EasyCVR视频综合管理平台&#xff0c;采用了开放式的网络结构&#xff0c;可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;同时…

【Web前端实操12】将一个100*100的盒子,变成圆形

将一个100*100的盒子&#xff0c;变成圆形&#xff0c;是一个简单的实操&#xff0c;想要完成这个实操&#xff0c;最关键的是一个知识点&#xff0c;使用 CSS3 border-radius 属性&#xff0c;你可以给任何元素制作 "圆角" border-radius 属性&#xff0c;可以使用…

软考复习之软件工程篇

软件生命周期 问题定义&#xff1a;要示系统分析员与用户进行交流&#xff0c;弄清”用户需要计算机解决什么问题”然后提出关于“系统目标与范围的说明”&#xff0c;提交用户审查和确认 可行性研究&#xff1a;一方面在于把待开发的系统的目标以明确的语言描述出来&#xf…

【Linux】shell外壳和权限

文章目录 shell外壳用户切换权限 shell外壳 什么是shell外壳呢&#xff1f;首先我们应该知道&#xff0c;用户和操作系统内核是不能直接接触的&#xff0c;因为首先操作系统本身就很难去操作&#xff0c;另一方面也是为了操作系统安全考虑&#xff0c;不能让用户直接去操作内核…

JeecgBoot 3.6.1实现Modal对话框,以为审核数据为例

JeecgBoot 3.6.1实现Modal对话框 vue使用的是3.0版本 文章目录 JeecgBoot 3.6.1实现Modal对话框前言一、列表页面关键代码示例二、textAuditModal.vue代码示例三、test.api.ts总结 前言 在工作中&#xff0c;有一个需求&#xff0c;要求&#xff0c;在数据列表页&#xff0c;…

SUBMIT指定用户名错误

1、SUBMIT说明 在ABAP中&#xff0c;SUBMIT关键字用于运行另一个ABAP程序。通过SUBMIT关键字&#xff0c;可以在当前程序内部调用其他程序&#xff0c;而无需关闭当前程序。 SUBMIT语句的一般语法如下&#xff1a; "--------------------斌将军-------------------- SUB…

Java接收curl发出的中文请求无法解析

最近做项目遇到了这种情况&#xff0c;Java接收curl发出的中文请求无法解析&#xff0c;英文请求一切正常&#xff0c;中文请求则对方服务器无法解析&#xff0c;可以猜测是中文导致的编码问题&#xff0c;但是奇怪的是&#xff0c;本地输出json也没有乱码&#xff0c;编解码正…

leetcode:三数之和---双指针

问题&#xff1a; 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复…