MFC 发起 HTTP Post 请求 发送MES消息

文章目录

  • 获取Token
    • 将获取的Token写入JSON文件
  • 将测试参数发送到http
    • 首先将测试参数写入到TestData.JSON文件
    • rapidjson 库需要将CString 进行类型转换才能使用,将CString 转换为const char*
  • 发送JSON 参数到http中,并且获取返回结果写入TestFinish.JSON文件
  • 读取TestFinish.JSON文件判断返回结果是否正确
    • Mes发送失败的错误日志
  • 类函数
  • 父类函数

获取Token

首先获取WebApi 的Token
在这里插入图片描述
执行请求Token函数
在这里插入图片描述

int CHttpClientJXJST::ExecuteRequest()
{//设置连接超时时间为20sm_pSession->SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 1000 * 20);m_pSession->SetOption(INTERNET_OPTION_CONNECT_BACKOFF, 1000); // 设置连接后退时间m_pSession->SetOption(INTERNET_OPTION_CONNECT_RETRIES, 3);    // 设置连接重试次数//通过网络会话对象创建一个 HTTP 连接对象,连接到 http://111.75.253.00 服务器,端口为8080//m_pConnection = m_pSession->GetHttpConnection(TEXT("111.75.253.00"), (INTERNET_PORT)8000);m_pConnection = m_pSession->GetHttpConnection(TEXT(theApp.m_oHardParaEx.m_sMesHttp), (INTERNET_PORT)8000);// 使用该连接对象创建一个 HTTP 文件对象,用于在服务器上打开一个请求,使用 HTTP POST 方法,指定请求的 URL 为 "/api/token/getToken"m_pFile = m_pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST, theApp.m_oHardParaEx.m_sMesURL,NULL, 1, NULL, TEXT("HTTP/1.1"), INTERNET_FLAG_RELOAD);// 设置需要提交的数据,包括请求头信息和 POST 数据//CString szHeaders = TEXT("Content-Type:application/json;charset=utf-8");//CString strFormData = TEXT("username=switchdevice&password=1234567");CString szHeaders = TEXT("Content-Type: application/x-www-form-urlencoded\r\n");m_pFile->AddRequestHeaders(szHeaders);// 设置表单数据//CString strFormData = TEXT("username=switchdevice&password=1234567");CString strFormData = TEXT("username=")+theApp.m_oHardParaEx.m_sMesUser+("&password=")+theApp.m_oHardParaEx.m_sMesPassWord;try {// 发送请求m_pFile->SendRequest(NULL, 0, (LPVOID)(LPCTSTR)strFormData, strFormData.GetLength());// 如果请求成功,继续执行其他操作} catch (CInternetException* pEx) {// 处理异常TCHAR szError[1024];pEx->GetErrorMessage(szError, 1024);// 在这里进行异常处理,例如输出错误信息或者进行其他适当的操作AfxMessageBox(szError);pEx->Delete(); // 删除异常对象}// 查询返回的状态码DWORD dwRet;m_pFile->QueryInfoStatusCode(dwRet);strFilePath = theApp.m_sRunPath + _T("\\sys\\response.JSON");if (dwRet != HTTP_STATUS_OK){msg =_T("");CString errText;errText.Format(_T("POST出错,错误码:%d"), dwRet);AfxMessageBox(errText);}else{int len = m_pFile->GetLength();char buf[2000];int numread;CFile MesFile( strFilePath, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);// 初始化 strFile 为空字符串CString strFile;// 循环读取数据while ((numread = m_pFile->Read(buf, sizeof(buf) - 1)) > 0){// 添加 '\0' 到 buf 数组中读取的最后一个字符的位置buf[numread] = '\0';// 追加数据到 strFilestrFile += buf;// 写入数据到文件MesFile.Write(buf, numread);}MesFile.Close();//读取JSON文件GetMsg(strFilePath);}	return SUCCESS;
}

将获取的Token写入JSON文件

CString CHttpClientJXJST::GetMsg(CString filePath)
{try {// 创建一个 CFile 对象CFile JsonFile;// 打开文件if (!JsonFile.Open(filePath, CFile::modeRead)){AfxMessageBox(_T("Failed to open JSON file."));return 0;}// 获取文件大小ULONGLONG fileSize = JsonFile.GetLength();// 创建一个缓冲区来存储文件内容char* buffer = new char[fileSize + 1];// 读取文件内容到缓冲区JsonFile.Read(buffer, (UINT)fileSize);// 添加字符串结尾标志buffer[fileSize] = '\0';// 关闭文件JsonFile.Close();// 使用 RapidJSON 解析 JSON 字符串rapidjson::Document document;document.Parse(buffer);// 检查解析是否成功if (document.HasParseError()) {AfxMessageBox(_T("JSON parse error: ") + CString(rapidjson::GetParseError_En(document.GetParseError())));delete[] buffer;return 0;}// 检查是否存在 msg 和 timestamp 字段if (document.HasMember("msg") && document.HasMember("timestamp")) {// 获取 msg 和 timestamp 值msg = CString(document["msg"].GetString());timestamp = document["timestamp"].GetUint64();// 释放缓冲区内存delete[] buffer;} else {AfxMessageBox(_T("JSON does not contain msg and timestamp fields."));delete[] buffer;return 0;}} catch (CFileException* pEx){// 处理文件操作异常TCHAR szCause[255];pEx->GetErrorMessage(szCause, 255);AfxMessageBox(_T("File operation error: ") + CString(szCause));pEx->Delete();return 0;}return msg;}

在这里插入图片描述

将测试参数发送到http

首先将测试参数写入到TestData.JSON文件

void CHttpClientJXJST::WirteJsonData(CString m_snCode,CString m_moBill,CString m_result,CXMLData* pData)
{strFilePath = theApp.m_sRunPath + _T("\\sys\\TestData.JSON");CFileException fileException;CFile JSONDataFile;// 尝试打开文件if (!JSONDataFile.Open(strFilePath, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary, &fileException)){AfxMessageBox(_T("打开TestData.JSON文件失败"));return;}// 创建一个空的 JSON 文档Document document;document.SetObject();// 将 deviceCode 字段添加到文档中Value deviceCode(StringToConstChar(CStringToString(theApp.m_oHardParaEx.m_sMesDeviceCode)), document.GetAllocator());// 将 processCode 字段添加到文档中Value processCode(StringToConstChar(CStringToString(theApp.m_oHardParaEx.m_sMesGX)), document.GetAllocator());// 将 snCode 字段添加到文档中Value snCode(StringToConstChar(CStringToString(m_snCode)), document.GetAllocator());//将  jobNo 字段添加到文档中Value jobNo(StringToConstChar(CStringToString(theApp.m_oHardParaEx.m_sMesJobNo)), document.GetAllocator());// 获取当前时间CTime currentTime = CTime::GetCurrentTime();// 格式化日期时间为字符串CString m_sDateTime = currentTime.Format(_T("%Y-%m-%d %H:%M:%S"));//时间Value date(StringToConstChar(CStringToString(m_sDateTime)), document.GetAllocator());//姓名Value user(StringToConstChar(CStringToString(theApp.m_oHardParaEx.m_sMesTestName)), document.GetAllocator());//生产单号Value moBill(StringToConstChar(CStringToString(m_moBill)), document.GetAllocator());//返回结果Value result(StringToConstChar(CStringToString(m_result)), document.GetAllocator());// 设置 JSON 字段document.AddMember("deviceCode", deviceCode, document.GetAllocator());		// 设备编号document.AddMember("processCode", processCode, document.GetAllocator());	 // 工序编号document.AddMember("snCode", snCode, document.GetAllocator());				// 检测条码document.AddMember("jobNo", jobNo, document.GetAllocator());				// 员工工号document.AddMember("date", date, document.GetAllocator());					// 时间document.AddMember("user", user, document.GetAllocator());					// 检测人名称document.AddMember("moBill", moBill, document.GetAllocator());				// 生产订单号document.AddMember("result", result, document.GetAllocator());				// 返回结果// 创建一个数组并添加到 JSON 文档中Value dataArray(kArrayType);int n = pData->m_oXMLItems.GetSize( );int i = 0;for(int i=0;i<n;i++){Value test(kObjectType);// 获取测试项目的关键字和值if(pData->m_oXMLItems.GetAt(i)!=NULL){CString skey = pData->m_oXMLItems[i]->sKey;			//检测项目编码CString stestName =pData->m_oXMLItems[i]->sTestName;//检测项目名称CString sminVal=pData->m_oXMLItems[i]->sMinVal;		//下限值CString smaxVal=pData->m_oXMLItems[i]->sMaxVal;		//上限值CString stestValue =pData->m_oXMLItems[i]->sTestVal;//检测项目值CString sresultInfo =pData->m_oXMLItems[i]->sResultInfo;//检测结果CString sbadCode =pData->m_oXMLItems[i]->sBadCode;//检测项目编码Value testCode(StringToConstChar(CStringToString(skey)), document.GetAllocator());Value testName(StringToConstChar(CStringToString(stestName)), document.GetAllocator());Value minVal(StringToConstChar(CStringToString(sminVal)), document.GetAllocator());Value maxVal(StringToConstChar(CStringToString(smaxVal)), document.GetAllocator());Value testValue(StringToConstChar(CStringToString(stestValue)), document.GetAllocator());Value resultInfo(StringToConstChar(CStringToString(sresultInfo)), document.GetAllocator());Value badCode(StringToConstChar(CStringToString(sbadCode)), document.GetAllocator());test.AddMember("testCode", testCode, document.GetAllocator());test.AddMember("testName",testName, document.GetAllocator());test.AddMember("minVal", minVal, document.GetAllocator());test.AddMember("maxVal", maxVal, document.GetAllocator());test.AddMember("testVal",testValue, document.GetAllocator());test.AddMember("resultInfo", resultInfo, document.GetAllocator());test.AddMember("badCode", badCode, document.GetAllocator());dataArray.PushBack(test, document.GetAllocator());}}document.AddMember("data", dataArray, document.GetAllocator());// 将 JSON 文档写入文件StringBuffer buffer;PrettyWriter<StringBuffer> writer(buffer);document.Accept(writer);CStringA jsonStr(buffer.GetString());// 将字符串写入文件try{JSONDataFile.Write(jsonStr, jsonStr.GetLength());JSONDataFile.Close();}catch (CFileException* e){// 处理文件写入错误TCHAR szError[1024];e->GetErrorMessage(szError, 1024);TRACE(_T("Failed to write JSON file: %s\n"), szError);e->Delete();}
}

生成的JSON 数据大致如下
在这里插入图片描述

rapidjson 库需要将CString 进行类型转换才能使用,将CString 转换为const char*

std::string CHttpClientJXJST::CStringToString(const CString& cstr)
{// 使用 CStringA 构造函数将 CString 转换为 ANSI 字符串CStringA strA(cstr);// 使用 ANSI 字符串构造 std::stringreturn std::string(strA.GetString());
}const char* CHttpClientJXJST::StringToConstChar(const std::string& str)
{return str.c_str();
}

发送JSON 参数到http中,并且获取返回结果写入TestFinish.JSON文件

void CHttpClientJXJST::TestFinishRequest()
{// 使用该连接对象创建一个 HTTP 文件对象,用于在服务器上打开一个请求,使用 HTTP POST 方法,指定请求的 URL 为 "/api/mom/device/saveData"m_pFile = m_pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST, theApp.m_oHardParaEx.m_sMesURL2,NULL, 1, NULL, TEXT("HTTP/1.1"), INTERNET_FLAG_RELOAD);// 设置请求头信息CString szHeaders = TEXT("Content-Type: application/json;charset=utf-8\r\n");szHeaders += TEXT("Authorization: ") + msg + TEXT("\r\n"); // 使用 msg 变量作为 Authorization 头的值m_pFile->AddRequestHeaders(szHeaders);//读取JSON文件            //单独创建一个JSON文件保存数据strFilePath = theApp.m_sRunPath + _T("\\sys\\TestData.JSON");CStringA strJsonData =ReadJSONFile(strFilePath);// 设置请求体数据为 JSON 格式DWORD dwDataLen = strJsonData.GetLength();// 设置请求体数据为 JSON 格式//DWORD dwDataLen = strJsonData.GetLength() * sizeof(TCHAR);// 发送请求//m_pFile->SendRequest(NULL, 0, (LPVOID)(LPCTSTR)strJsonData, dwDataLen);try {// 发送请求m_pFile->SendRequest(NULL, 0, (LPVOID)(LPSTR)strJsonData.GetBuffer(), dwDataLen);// 如果请求成功,继续执行其他操作} catch (CInternetException* pEx) {// 处理异常TCHAR szError[1024];pEx->GetErrorMessage(szError, 1024);// 在这里进行异常处理,例如输出错误信息或者进行其他适当的操作AfxMessageBox(szError);pEx->Delete(); // 删除异常对象}// 查询返回的状态码DWORD dwRet;m_pFile->QueryInfoStatusCode(dwRet);strFilePath = theApp.m_sRunPath + _T("\\sys\\TestFinish.JSON");if (dwRet != HTTP_STATUS_OK){CString errText;errText.Format(_T("POST出错,错误码:%d"), dwRet);AfxMessageBox(errText);}else{int len = m_pFile->GetLength();char buf[2000];int numread;CFile MesFile( strFilePath, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);// 初始化 strFile 为空字符串CString strFile;// 循环读取数据while ((numread = m_pFile->Read(buf, sizeof(buf) - 1)) > 0){// 添加 '\0' 到 buf 数组中读取的最后一个字符的位置buf[numread] = '\0';// 追加数据到 strFilestrFile += buf;// 写入数据到文件MesFile.Write(buf, numread);}MesFile.Close();}
}

读取TestFinish.JSON文件判断返回结果是否正确

CString CHttpClientJXJST::GetFinishResult(CString filePath)
{m_sResult=_T("");try {// 创建一个 CFile 对象CFile JsonFile;// 打开文件if (!JsonFile.Open(filePath, CFile::modeRead)){AfxMessageBox(_T("Failed to open JSON file."));return 0;}// 获取文件大小ULONGLONG fileSize = JsonFile.GetLength();// 创建一个缓冲区来存储文件内容char* buffer = new char[fileSize + 1];// 读取文件内容到缓冲区JsonFile.Read(buffer, (UINT)fileSize);// 添加字符串结尾标志buffer[fileSize] = '\0';// 关闭文件JsonFile.Close();// 使用 RapidJSON 解析 JSON 字符串rapidjson::Document document;document.Parse(buffer);// 检查解析是否成功if (document.HasParseError()) {AfxMessageBox(_T("JSON parse error: ") + CString(rapidjson::GetParseError_En(document.GetParseError())));delete[] buffer;return 0;}// 检查是否存在 msg if (document.HasMember("msg")) {// 获取 msg 字段的值const rapidjson::Value& msgValue = document["msg"];m_sResult = CStringA(document["msg"].GetString());if (msgValue.IsString()) {// 获取字符串的长度size_t length = msgValue.GetStringLength();// 获取字符串的首指针const char* msgString = msgValue.GetString();// 计算需要的缓冲区大小int bufferSize = MultiByteToWideChar(CP_UTF8, 0, msgString, -1, nullptr, 0);// 分配缓冲区wchar_t* utf16Buffer = new wchar_t[bufferSize];// 进行编码转换MultiByteToWideChar(CP_UTF8, 0, msgString, -1, utf16Buffer, bufferSize);// 将 wchar_t* 转换为 CStringm_sResult = CString(utf16Buffer);// 释放内存delete[] utf16Buffer;}else {// 如果值不是字符串类型,进行相应的错误处理AfxMessageBox(_T("Value of 'msg' is not a string."));}// 释放缓冲区内存delete[] buffer;} else {AfxMessageBox(_T("JSON does not contain msg and timestamp fields."));delete[] buffer;return 0;}} catch (CFileException* pEx){// 处理文件操作异常TCHAR szCause[255];pEx->GetErrorMessage(szCause, 255);AfxMessageBox(_T("File operation error: ") + CString(szCause));pEx->Delete();return 0;}return m_sResult;}

在这里插入图片描述在这里插入图片描述

Mes发送失败的错误日志

void CHttpClientJXJST::OutputLog(CString msg)
{try{strFilePath = theApp.m_sRunPath + _T("\\sys\\log.txt");//设置文件的打开参数CStdioFile outFile(strFilePath, CFile::modeNoTruncate | CFile::modeCreate | CFile::modeWrite | CFile::typeText);CString msLine;CTime CurTime = CTime::GetCurrentTime();msLine = CurTime.Format("[%Y-%B-%d %A, %H:%M:%S] ") + msg;msLine += "\n";//在文件末尾插入新纪录outFile.SeekToEnd();outFile.WriteString( msLine );outFile.Close();}catch(CFileException *fx){fx->Delete();}
}

在这里插入图片描述

类函数

#pragma once
#include "HttpClient.h"
#include <afx.h>  // 包含 MFC 核心头文件
#include <afxwin.h> // 包含 MFC Windows 类的头文件
#include "rapidjson/document.h"
#include "rapidjson/error/en.h"
#include "rapidjson/stringbuffer.h"
#include "rapidjson/writer.h"
#include "rapidjson/istreamwrapper.h"
#include "rapidjson/prettywriter.h"
#include "rapidjson/filereadstream.h"#include <iostream>#include <atlstr.h> // 包含 CString 头文件
#include <string>
using namespace rapidjson;
using namespace std;class CXMLData;
class CHttpClientJXJST :public CHttpClient
{
public:CHttpClientJXJST(void);~CHttpClientJXJST(void);public:int ExecuteRequest(); //开启程序请求http //测试完成请求httpvoid TestFinishRequest();//测试完成请求http 返回结果CString GetFinishResult(CString filePath);//读取JOSN 文件 获取msg->tokenCString GetMsg(CString filePath);//读取JOSN 文件 获取msg->token//WirteJsonData 文件//1.检测条码 snCode//2.生产单号 moBill//3.总判定结果 resultvoid WirteJsonData(CString m_snCode,CString m_moBill,CString m_result,CXMLData* pData);//写入JSON文件数据CStringA ReadJSONFile(const CString& filePath);std::string CStringToString(const CString& cstr);//CString 转换为std::stringconst char* StringToConstChar(const std::string& str);//std::string 转换为const char*void OutputLog(CString msg);//错误日志
public:CString msg;//TokenULONGLONG timestamp;//时间戳//获取文件路径CString strFilePath;//JSON文件路径CString m_sResult;//读取的返回结果
};

父类函数

在这里插入图片描述

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

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

相关文章

SpringSecurity6从入门到实战之SpringSecurity快速入门

SpringSecurity6从入门到实战之SpringSecurity快速入门 环境准备 依赖版本号springsecurity6.0.8springboot3.0.12JDK17 这里尽量与我依赖一致,免得在学习过程中出现位置的bug等 创建工程 这里直接选择springboot初始化快速搭建工程,导入对应的jdk17进行创建 直接勾选一个web…

Redhat9 LAMP安全配置方案及测试

目录 数据库主机 安装Mariadb数据库服务 设置mariadb开机自动启动 Php主机 部署Apache服务器 设置apache服务开机自启 安装php 安装 phpMyAdmin 打开测试机 更新软件包列表&#xff1a; 首先&#xff0c;确保你的软件包列表是最新的。打开终端并输入以下命令&#xf…

Linux查看设备信息命令

dmidecode | grep Product Name 查看grub版本号&#xff1a;rpm -qa | grep -i "grub" 客户端操作系统版本&#xff1a; cat /etc/issue cat /etc/redhat-release 处理器品牌及型号&#xff1a; less /proc/cpuinfo |grep model

【TCP协议中104解析】wireshark抓取流量包工具,群殴协议解析基础

Tcp ,104 ,wireshark工具进行解析 IEC104 是用于监控和诊断工业控制网络的一种标准&#xff0c;而 Wireshark则是一款常用的网络协议分析工具&#xff0c;可以用干解析TEC104 报文。本文将介绍如何使用 Wireshark解析 IEC104报文&#xff0c;以及解析过 程中的注意事项。 一、安…

AI图书推荐:用ChatGPT和Python搭建AI应用来变现

《用ChatGPT和Python搭建AI应用来变现》&#xff08;Building AI Applications with ChatGPT API&#xff09;将ChatGPT API与Python结合使用&#xff0c;可以开启构建非凡AI应用的大门。通过利用这些API&#xff0c;你可以专注于应用逻辑和用户体验&#xff0c;而ChatGPT强大的…

Axios的使用简单说明

axios 请求方式和参数 axios 可以发送 ajax 请求&#xff0c;不同的方法可以发送不同的请求: axios.get&#xff1a;发送get请求 axios.post&#xff1a;发送post请求 axios.put&#xff1a;发送put请求 axios.delete&#xff1a;发送delete请求 无论哪种方法&#xff0c;第一…

【2】:向量与矩阵

向量 既有大小又有方向的量叫做向量 向量的模 向量的长度 单位向量 (只表示方向不表示长度) 向量的加减运算 向量求和 行向量与列向量的置换 图形学中竖着写 向量的长度计算 点乘&#xff08;计算向量间夹角&#xff09; 点乘满足的运算规律 交换律、结合律、分配…

MouseBoost Pro for Mac v3.4.7 鼠标右键助手 安装教程【支持M芯片】

MouseBoost Pro for Mac v3.4.7 鼠标右键助手 安装教程【支持M芯片】 原文地址&#xff1a;https://blog.csdn.net/weixin_48311847/article/details/139201501

Kibana创建ElasticSearch 用户角色

文章目录 1, ES 权限参考2, 某应用的管理员权限&#xff1a;可以open/close/delete/cat/read/write 索引3, 某应用的读写权限&#xff1a;可以cat/read/write 索引 &#xff08;不能删除索引或数据&#xff09;4, 某应用的只读权限 1, ES 权限参考 https://www.elastic.co/gui…

Notepad++不显示CRLF的方法

View -> Show Symbol -> 去掉勾选 Show All Characters

【教程】PaddleOCR高精度文字识别

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ PaddleOCR/doc/doc_ch/quickstart.md at main PaddlePaddle/PaddleOCR GitHub 安装 pip install paddlepaddle -i https://mirror.baidu.com/pypi/s…

新版idea配置git步骤及项目导入

目录 git安装 下载 打开git Bash 配置全局用户名及邮箱 查看已经配置的用户名和邮箱 在IDEA中设置Git 问题解决 项目导入 git安装 下载 进入官网 Git - Downloads 点击所属本机系统&#xff0c;window如下图 选择64位安装 按照默认步骤一直下一步即可 打开git Bash …

HackTheBox-Machines--Beep

Beep测试过程 1 信息收集 nmap端口扫描 gryphonwsdl ~ % nmap -sC -sV 10.129.137.179 Starting Nmap 7.94 ( https://nmap.org ) at 2024-05-28 14:39 CST Nmap scan report for 10.129.229.183 Host is up (0.28s latency). Not shown: 988 closed tcp ports (conn-refused…

Nacos 2.x 系列【12】配置加密插件

文章目录 1. 前言2. 安装插件2.1 编译2.2 客户端2.3 服务端 3. 测试 1. 前言 为保证用户敏感配置数据的安全&#xff0c;Nacos提供了配置加密的新特性。降低了用户使用的风险&#xff0c;也不需要再对配置进行单独的加密处理。 前提条件&#xff1a; 版本:老版本暂时不兼容&…

Leetcode621. 任务调度器

Every day a Leetcode 题目来源&#xff1a;621. 任务调度器 类似题目&#xff1a;1953. 你可以工作的最大周数 解法1&#xff1a;贪心 本质上来说&#xff0c;我们需要构造一个尽量短的&#xff0c;相同元素间隔 > (n1) 的序列。 用一个数组 cnt 统计每个任务的次数。…

【御控工业物联网】 Java JSON结构转换、JSON结构重构、JSON结构互换(17):数组To对象——键值互换属性重组

文章目录 一、JSON结构转换是什么&#xff1f;二、核心构件之转换映射三、案例之《JSON数组 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换…

介绍Django Ninja框架

文章目录 安装快速开始特性详解自动文档生成定义请求和响应模型异步支持中间件支持测试客户端 结论 Django Ninja是一个基于Python的快速API开发框架&#xff0c;它结合了Django和FastAPI的优点&#xff0c;提供了简单易用的方式来构建高性能的Web API。 安装 使用以下命令安…

CSS 介绍及用法,常用属性

一、CSS介绍 A. 简介 CSS全称&#xff1a;全称为层叠样式表&#xff08;Cascading Style Sheets&#xff09;&#xff0c;是一种用于描述网页外观和格式的计算机语言。CSS可以使网页的布局更加丰富和多样化&#xff0c;并且可以将样式信息与网页内容分离&#xff0c;使得网…

Github 2024-05-29 C开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-29统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目10C++项目3PHP项目1PHP:流行的Web开发脚本语言 创建周期:4710 天开发语言:C, PHP协议类型:OtherStar数量:37340 个Fork数量:7657 次…

003 仿muduo实现高性能服务器组件_前置知识

​&#x1f308;个人主页&#xff1a;Fan_558 &#x1f525; 系列专栏&#xff1a;仿muduo &#x1f339;关注我&#x1f4aa;&#x1f3fb;带你学更多知识 文章目录 前言时间轮timewheel设计正则表达式介绍&#xff08;了解知道怎么使用&#xff09;通用型any容器的实现 小结 …