UE Http笔记

news2025/1/21 1:03:49

c++参考链接

UE4 开发如何使用 Http 请求_wx61ae2f5191643的技术博客_51CTO博客

虚幻引擎:UEC++如何对JSON文件进行读写?-CSDN博客

UE4 HTTP使用

官方免费插件

VaRest

在代码插件创建的VaRest - 虚幻引擎商城

UE5在蓝图中使用Varest插件Get,Post两种常见请求方式_慢慢沉的博客-CSDN博客

UE4使用VaRest插件请求httpAPI以及解析json格式数据_ue4 varest-CSDN博客

示例代码

里面有部分是我测试Http下载文件的代码.所以实际效果很乱.自行理解删减

  • 单纯的Http请求.返回值因为与下面这个下载是同一个Class里面所以是混乱的
  • Http下载文件 UE Http下载文件/解压压缩包_Vince丶的博客-CSDN博客

xxx..Build.cs

"HTTP",
"Json",
"JsonUtilities"
.h

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintAsyncActionBase.h"
#include "Interfaces/IHttpRequest.h"
#include "AsyncHttpObject.generated.h"

#pragma region One

DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FDownloadProgressDelegate,
	const int32&, ReceivedDataInBytes,
	const int32&, TotalDataInBytes,
	const TArray<uint8>&, BinaryData
);
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FDownloadDelegate);

#pragma endregion

#pragma region Two

UENUM(BlueprintType)
enum class EPTRequestVerb : uint8
{
	GET,
	POST
};


#pragma endregion
/**
 *
 */
UCLASS()
class PIECETOGETHERTOOLS_API UAsyncHttpObject : public UBlueprintAsyncActionBase
{
	GENERATED_BODY()

public:

#pragma region One
	UFUNCTION(BlueprintCallable, Category = "Vince | AsyncHttp", meta = (BlueprintInternalUseOnly = "true"))
	static UAsyncHttpObject* AsyncHttpDownload(const FString& URL, FString fileSavePath, FString ileSaveName);

	void DownloadRequestStart(const FString& url);
	void DownloadRequestHandle(FHttpRequestPtr request, FHttpResponsePtr response, bool bWasSuccessful);
	void DownloadProgress(FHttpRequestPtr request, int32 bytesSent, int32 bytesReceived);

	//输出节点
	UPROPERTY(BlueprintAssignable, Category = "Vince | AsyncHttp")
	FDownloadProgressDelegate OnProgressUpdate; //最好把有参数的放在前面,不然参数在蓝图节点有时候被吃掉了

	//输出节点
	UPROPERTY(BlueprintAssignable, Category = "Vince | AsyncHttp")
	FDownloadDelegate OnSucc;

	//输出节点
	UPROPERTY(BlueprintAssignable, Category = "Vince | AsyncHttp")
	FDownloadDelegate OnFailed;



#pragma endregion

#pragma region Two

	UFUNCTION(BlueprintCallable, Category = "Vince | AsyncHttp", meta = (BlueprintInternalUseOnly = "true"))
	static UAsyncHttpObject* ConnectAsyncHttp(EPTRequestVerb verb, const FString& URL);

	FString MassageBody = TEXT("");

	void AsyncRequestHandle(FHttpRequestPtr request, FHttpResponsePtr response, bool bWasSuccessful);


#pragma endregion

.cpp

 // Fill out your copyright notice in the Description page of Project Settings.


#include "AsyncHttpObject.h"
#include "HttpModule.h"
#include "Interfaces/IHttpResponse.h"
#include "Misc/Paths.h"
#include "HAL/PlatformFileManager.h"
#include "GenericPlatform/GenericPlatformFile.h"



#pragma region One

//存储目录
FString FileSavePath =TEXT("");

//存储名字
FString FileSaveName = TEXT("");

UAsyncHttpObject* UAsyncHttpObject::AsyncHttpDownload(const FString& URL, FString fileSavePath, FString fileSaveName)
{

	UAsyncHttpObject* AsyncHttpObject = NewObject<UAsyncHttpObject>();
	AsyncHttpObject->DownloadRequestStart(URL);

	FileSavePath = fileSavePath;
	FileSaveName = fileSaveName;

	return AsyncHttpObject;
}

//开始请求下载
void UAsyncHttpObject::DownloadRequestStart(const FString& url)
{
	TSharedRef<IHttpRequest, ESPMode::ThreadSafe> request = FHttpModule::Get().CreateRequest();
	request->SetVerb("GET");
	request->SetURL(url);
	request->OnProcessRequestComplete().BindUObject(this, &UAsyncHttpObject::DownloadRequestHandle); //请求回调
	request->OnRequestProgress().BindUObject(this, &UAsyncHttpObject::DownloadProgress);// 下载进度
	request->ProcessRequest();



	RemoveFromRoot(); // 手动GC
}

请求回调
void UAsyncHttpObject::DownloadRequestHandle(FHttpRequestPtr request, FHttpResponsePtr response, bool bWasSuccessful)
{
	RemoveFromRoot();


	if (bWasSuccessful && response.IsValid() && EHttpResponseCodes::IsOk(response->GetResponseCode()))
	{
		if (response->GetContentLength() > 0) {
			TArray<uint8> EmptyData;
			OnProgressUpdate.Broadcast(response->GetContentLength(), response->GetContentLength(), EmptyData);
		}

		//FString FileSavePath = FPaths::ProjectDir() + "/download/gameplay.png";

	     
		//下载返回类型设置
		FString sType, SLeft, SRight;
		sType = response->GetHeader(TEXT("Content-Type"));
		sType.Split("/",&SLeft,&SRight);
		FileSaveName.Append(FString::Printf(TEXT(".%s"), *SRight)) ;

		//组合 存储地址
		FileSavePath = FPaths::Combine(FileSavePath, FileSaveName);

		FString Path, Filename, Extension;
		FPaths::Split(FileSavePath, Path, Filename, Extension);


		 
		IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile();

		if (!PlatformFile.DirectoryExists(*Path))
		{
			if (!PlatformFile.CreateDirectoryTree(*Path))
			{
				UE_LOG(LogTemp, Error, TEXT("Create Directory Failed!"));
				OnFailed.Broadcast();
				return;
			}
		}

		IFileHandle* FileHandle = PlatformFile.OpenWrite(*FileSavePath);
		if (FileHandle)
		{
			FileHandle->Write(response->GetContent().GetData(), response->GetContentLength());
			delete FileHandle;
			OnSucc.Broadcast();
			return;
		}
		else {
			UE_LOG(LogTemp, Error, TEXT("Save File Failed!"));
			OnFailed.Broadcast();
			return;
		}

	}
	UE_LOG(LogTemp, Error, TEXT("download File Failed!"));
	OnFailed.Broadcast();
	return;
}

// 下载进度
void UAsyncHttpObject::DownloadProgress(FHttpRequestPtr request, int32 bytesSent, int32 bytesReceived)
{
	if (request->GetResponse()->GetContentLength() > 0)
	{
		TArray<uint8> EmptyData;
		OnProgressUpdate.Broadcast(bytesReceived, request->GetResponse()->GetContentLength(), EmptyData);
	}
}


UAsyncHttpObject* UAsyncHttpObject::ConnectAsyncHttp(EPTRequestVerb verb, const FString& URL)
{
	UAsyncHttpObject* AsyncHttpObject = NewObject<UAsyncHttpObject>();
	AsyncHttpObject->MassageBody = "";

	if (URL.IsEmpty())
	{
	//	AsyncHttpObject->OnFailed.Broadcast("URL Is Null");
	}


	TSharedRef<IHttpRequest, ESPMode::ThreadSafe> request = FHttpModule::Get().CreateRequest();


	switch (verb)
	{
	case EPTRequestVerb::GET:

		//设置请求方式
		request->SetVerb(TEXT("GET"));
		//设置头
		request->SetHeader(TEXT("Content-Type"), TEXT("application/json;charset=utf-8"));

		break;
	case EPTRequestVerb::POST:


		request->SetVerb(TEXT("POST"));
		request->SetHeader(TEXT("Content-Type"), TEXT("application/x - www-form-urlencoded"));
		break;
	default:
		break;
	}

	//设置URL
	request->SetURL(URL);

	//绑定回调
	request->OnProcessRequestComplete().BindUObject(AsyncHttpObject, &UAsyncHttpObject::AsyncRequestHandle); //请求回调
	request->OnRequestProgress().BindUObject(AsyncHttpObject, &UAsyncHttpObject::DownloadProgress);// 下载进度

	内容
	TSharedRef<FJsonObject> pJsonObject = MakeShared<FJsonObject>();
	TSharedRef<FJsonObject> pJsonObject1 = MakeShared<FJsonObject>();

	//
	//pJsonObject->SetStringField("TD", URL);
	//pJsonObject->SetStringField("TD1", "123");
	//
	pJsonObject1->SetObjectField("TDB",pJsonObject);
	//FString OutputString;
	//TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&OutputString);
	//FJsonSerializer::Serialize(pJsonObject1, Writer);

	Json内容设置
	//request->SetContentAsString(OutputString);

	//GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Yellow, OutputString, false);


	//请求
	request->ProcessRequest();

	AsyncHttpObject->RemoveFromRoot(); // 手动GC

	return AsyncHttpObject;

}

void UAsyncHttpObject::AsyncRequestHandle(FHttpRequestPtr request, FHttpResponsePtr response, bool bWasSuccessful)
{
	RemoveFromRoot(); // 手动GC

	if (bWasSuccessful && response.IsValid() && EHttpResponseCodes::IsOk(response->GetResponseCode()))
	{
	
		// 获得返回的json数据
		TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(response->GetContentAsString());
		// 把FString转成TCHAR
		TCHAR* serializedChar = response->GetContentAsString().GetCharArray().GetData();
		// 解决中文乱码问题,服务端也是utf-8
		TCHAR_TO_UTF8(serializedChar);
		FString myData(serializedChar);

		// 创建Json对象
		TSharedPtr<FJsonObject> JsonObject;
		// 反序列化json
		bool bIsOk = FJsonSerializer::Deserialize(JsonReader, JsonObject);
		// 判断是否反序列化成功

		if (bIsOk)
		{
			FString data = JsonObject->GetStringField("city");
			//FWHelper::Debug(data);
			UE_LOG(LogTemp, Warning, TEXT("%s"), *data);
			UE_LOG(LogTemp, Warning, TEXT("%s"), *myData);

			FString OutputString;
			TSharedRef<TJsonWriter<TCHAR, TPrettyJsonPrintPolicy<TCHAR>>> Writer = TJsonWriterFactory<TCHAR, TPrettyJsonPrintPolicy<TCHAR>>::Create(&OutputString);
			FJsonSerializer::Serialize(JsonObject.ToSharedRef(), Writer); //Serialize:把内存中的对象转为便于存储和传输的数据
			//打印
			UE_LOG(LogNet, Warning, TEXT("output 1:\n%s"), *OutputString);

			TSharedPtr<FJsonObject, ESPMode::ThreadSafe> Object = JsonObject->GetObjectField(TEXT("name"));
			TSharedPtr<FJsonObject, ESPMode::ThreadSafe> ObjectField = Object->GetObjectField(TEXT("realtime"));
			FString StringField = ObjectField->GetStringField("text");

		}


	}
}



#pragma endregion



//void UAsyncHttpObject::XieJson(FString& outjsonStr, const UObject* WorldContextObject)
//{
//	// 声明一个存储Json内容的字符串
//	FString JsonStr;
//	//GetJSONStr(JsonStr,WorldContextObject);
//
//	// 创建一个Json编写器
//	TSharedRef<TJsonWriter<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>> JsonWriter = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>::Create(&JsonStr);
//	//TSharedRef<TJsonWriter<>> JsonWriter = TJsonWriterFactory<>::Create(&JsonStr);
//
//	// 声明Json对象写入开始
//	JsonWriter->WriteObjectStart();
//	JsonWriter->WriteValue(TEXT("Time"), TEXT("21"));
//
//	// 声明Json数组写入开始
//	JsonWriter->WriteArrayStart(TEXT("Data"));
//	for (int i = 0; i < 2; i++)
//	{
//		JsonWriter->WriteObjectStart();
//		JsonWriter->WriteValue(TEXT("key"), i);
//		JsonWriter->WriteObjectEnd();
//	}
//	JsonWriter->WriteArrayEnd();
//
//	JsonWriter->WriteObjectEnd();
//	// 停止写入
//	JsonWriter->Close();
//
//	UE_LOG(LogTemp, Warning, TEXT("%s"), *JsonStr);
//	outjsonStr = JsonStr;
//
//	GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Yellow, outjsonStr, false);
//}

写入Http请求内容示例

写入Http请求Json内容我自己测试的可以有2种习惯.看自己习惯.c++能力有限.可能描述有误.自行理解把.

第一种直接给 FJsonObject 直接写入 .最后在转成Fstring

内容
TSharedRef<FJsonObject> pJsonObject = MakeShared<FJsonObject>();
TSharedRef<FJsonObject> pJsonObject1 = MakeShared<FJsonObject>();


pJsonObject->SetStringField("TD", URL);
pJsonObject->SetStringField("TD1", "123");

//pJsonObject1->SetObjectField("TDB",pJsonObject);
FString OutputString;
TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&OutputString);
FJsonSerializer::Serialize(pJsonObject1, Writer);

//Json内容设置
request->SetContentAsString(OutputString);

GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Yellow, OutputString, false);

第二种 创建一个Json编写器 直接编写Json.

.h

UFUNCTION(BlueprintCallable, Category = "Vince | AsyncHttp", meta = (WorldContext = "WorldContextObject"))
static	void XieJson(FString& outjsonStr, const UObject* WorldContextObject);

.cpp

void UPieceTogetherToolsBPLibrary::XieJson(FString& outjsonStr, const UObject* WorldContextObject)
{
	// 声明一个存储Json内容的字符串
	FString JsonStr;
	//GetJSONStr(JsonStr,WorldContextObject);

	// 创建一个Json编写器
	TSharedRef<TJsonWriter<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>> JsonWriter = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>::Create(&JsonStr);
	//TSharedRef<TJsonWriter<>> JsonWriter = TJsonWriterFactory<>::Create(&JsonStr);

	// 声明Json对象写入开始
	JsonWriter->WriteObjectStart();
	JsonWriter->WriteValue(TEXT("Time"), TEXT("21"));

	// 声明Json数组写入开始
	JsonWriter->WriteArrayStart(TEXT("Data"));
	for (int i = 0; i < 2; i++)
	{
		JsonWriter->WriteValue(TEXT("key"), i);
	}
	JsonWriter->WriteArrayEnd();

	JsonWriter->WriteObjectEnd();
	// 停止写入
	JsonWriter->Close();

	UE_LOG(LogTemp, Warning, TEXT("%s"), *JsonStr);
	outjsonStr = JsonStr;

	GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Yellow, outjsonStr, false);
}
Http接收回调解析数据示例

.cpp

		// 获得返回的json数据
		TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(response->GetContentAsString());
		// 把FString转成TCHAR
		TCHAR* serializedChar = response->GetContentAsString().GetCharArray().GetData();
		// 解决中文乱码问题,服务端也是utf-8
		TCHAR_TO_UTF8(serializedChar);
		FString myData(serializedChar);

		// 创建Json对象
		TSharedPtr<FJsonObject> JsonObject;
		// 反序列化json
		bool bIsOk = FJsonSerializer::Deserialize(JsonReader, JsonObject);
		// 判断是否反序列化成功

		if (bIsOk)
		{
			FString data = JsonObject->GetStringField("city");
			//FWHelper::Debug(data);
			UE_LOG(LogTemp, Warning, TEXT("%s"), *data);
			UE_LOG(LogTemp, Warning, TEXT("%s"), *myData);

			FString OutputString;
			TSharedRef<TJsonWriter<TCHAR, TPrettyJsonPrintPolicy<TCHAR>>> Writer = TJsonWriterFactory<TCHAR, TPrettyJsonPrintPolicy<TCHAR>>::Create(&OutputString);
			FJsonSerializer::Serialize(JsonObject.ToSharedRef(), Writer); //Serialize:把内存中的对象转为便于存储和传输的数据
			//打印
			UE_LOG(LogNet, Warning, TEXT("output 1:\n%s"), *OutputString);

			TSharedPtr<FJsonObject, ESPMode::ThreadSafe> Object = JsonObject->GetObjectField(TEXT("name"));
			TSharedPtr<FJsonObject, ESPMode::ThreadSafe> ObjectField = Object->GetObjectField(TEXT("realtime"));
			FString StringField = ObjectField->GetStringField("text");

		}

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

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

相关文章

No Chromedriver found that can automate Chrome ‘x.x.xxxx‘的解决办法

一、前置说明 在使用Appium对Android设备自动化测试时&#xff0c;切换WebView时抛出异常&#xff1a; selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: No Chromedriver foun…

第54天:django学习(三)

页面上的增删改查 创建一个django项目&#xff08;使用django3版本&#xff09;day54——dj&#xff0c;并创建应用app01 在models.py文件中创建表 class UserInfo(models.Model):username models.CharField(max_length32)password models.CharField(max_length32)gender m…

删除PPT文件的备注内容

解决方案的工作经常汇报以及经常做ppt的回报工作&#xff0c;但是删除备注很痛苦。 在网上或者拿历史的ppt文件修改后&#xff0c;需要删除ppt备注内容以及删除ppt个人文件信息的办法&#xff1a; 现象&#xff1a;很多备注信息&#xff0c;需要删除 解决办法一、 文件--信息-…

Django + Matplotlib:实现数据分析显示与下载为PDF或SVG

写作背景 首先&#xff0c;数据分析在当前的信息时代中扮演着重要的角色。随着数据量的增加和复杂性的提高&#xff0c;人们对于数据分析的需求也越来越高。 其次&#xff0c;笔者也确确实实曾经接到过一个这样的开发需求&#xff0c;甲方是一个医疗方面的科研团队&#xff0…

最新版本——Hadoop3.3.6单机版完全部署指南

大家好&#xff0c;我是独孤风&#xff0c;大数据流动的作者。 本文基于最新的 Hadoop 3.3.6 的版本编写&#xff0c;带大家通过单机版充分了解 Apache Hadoop 的使用。本文更强调实践&#xff0c;实践是大数据学习的重要环节&#xff0c;也能在实践中对该技术有更深的理解&…

Excel 表列序号

题目链接 Excel 表列序号 题目描述 注意点 columnTitle 仅由大写英文组成1 < columnTitle.length < 7 解答思路 对于"CAB"&#xff0c;计算其序列号的思路&#xff1a;字母B的贡献值为2&#xff0c;字母A的贡献值为1 * 26&#xff0c;字母C的贡献值为3 * …

销售如何用企微SCRM加速潜客孵化,提升转化率?

营销推广与销售转化相互协同是势不可挡的趋势 直播带货、抖音房云店等玩法的兴起&#xff0c;是当前社交网络将营销与销售场景合二为一的缩影。因此企业在业务上&#xff0c;也要让营销推广与销售转化相互协同。以客户成交为中心&#xff0c;不局限于单项目获客、服务、转化的…

浅谈基于泛在电力物联网的综合能源管控平台设计及硬件选型

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;城区内一般都具有错综复杂的能源系统&#xff0c;且大部分能耗都集中于城区的各企、事业单位中。基于泛在电力物联网的综合能源管控平台将城区内从能源产生到能源消耗的整体流动情况采用大屏清晰展示&#xff…

Linux-进程之间的通信

目录 ​编辑 一.什么是进程之间的通信 二.进程之间的通信所访问的数据 三.进程之间的通信是如何做到的 四.基于内存文件级别的通信方式——管道 1.什么是管道 2.管道的建立过程——匿名管道 a.什么是匿名管道 b.匿名管道特点&#xff1a; c.使用匿名管道的…

IDEA中配置Git

Git 在IDEA中使用Git1 在IDEA中配置Git2 在IDEA中使用Git2.1在IDEA中创建工程并将工程添加至Git2.2 将文件添加到暂存区2.3 提交文件2.4 将代码推送到远程仓库2.5 从远程仓库克隆工程到本地2.6 从远程拉取代码2.7 版本对比2.8 创建分支2.9 切换分支2.10 分支合并 3 使用IDEA进行…

【开源】基于Vue.js的二手车交易系统

文末获取源码&#xff0c;项目编号&#xff1a; S 084 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S084。} 文末获取源码&#xff0c;项目编号&#xff1a;S084。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 二手车档案管理模块…

教程篇(7.2) 01. 介绍和初始访问 ❀ FortiAnalyzer分析师 ❀ Fortinet 网络安全专家 NSE5

在本课中&#xff0c;你将了解FortiAnalyzer的关键功能和概念&#xff0c;以及如何最初访问FortiAnalyzer。 FortiAnalyzer将日志记录、分析和报告集成到一个系统中&#xff0c;因此你可以快速识别和响应。 在本课中&#xff0c;你将探索上图显示的主题。 通过展示FortiAnalyze…

算能 MilkV Duo开发板实战——opencv-mobile (迷你版opencv库)的移植和应用

前言 OpenCV是一种开源的计算机视觉和机器学习软件库&#xff0c;旨在提供一组通用的计算机视觉工具。它用于图像处理、目标识别、人脸识别、机器学习等领域&#xff0c;广泛应用于计算机视觉任务。 OpenCV-Mobile是OpenCV库的轻量版本&#xff0c;专为移动平台&#xff08;A…

基于ssm少儿编程管理系统源码和论文

idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 环境&#xff1a; jdk8 tomcat8.5 开发技术 ssm 基于ssm少儿编程管理系统源码和论文744 摘要 网络的广泛应用给生活带来了十分的便利。所以把少儿编程管理系统与现在网络相结合&#xff0c;利用java技术建设…

Kafka Connect :构建强大分布式数据集成方案

Kafka Connect 是 Apache Kafka 生态系统中的关键组件&#xff0c;专为构建可靠、高效的分布式数据集成解决方案而设计。本文将深入探讨 Kafka Connect 的核心架构、使用方法以及如何通过丰富的示例代码解决实际的数据集成挑战。 Kafka Connect 的核心架构 Kafka Connect 的核…

flex布局的flex为1到底是什么

参考博客&#xff1a;flex:1什么意思_公孙元二的博客-CSDN博客 flex&#xff1a;1即为flex-grow&#xff1a;1&#xff0c;经常用作自适应布局&#xff0c;将父容器的display&#xff1a;flex&#xff0c;侧边栏大小固定后&#xff0c;将内容区flex&#xff1a;1&#xff0c;内…

【Spring 源码】 贯穿 Bean 生命周期的核心类之 AbstractAutowireCapableBeanFactory

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

Liunx Centos 防火墙操作

liunx centos 防火墙 查看防火墙状态 systemctl status firewalld查看已经开放的端口 firewall-cmd --list-ports添加端口3306 firewall-cmd --zonepublic --add-port3306/tcp --permanent重启防火墙 firewall-cmd --reload数据库开放账号可以外网登陆 mysql -u root -p …

Matlab 用矩阵画图

文章目录 Part.I IntroductionChap.I 预备知识Chap.II 概要Chap.III 杂记 Part.II 用矩阵画图Chap.I 摸索过程Chap.II 绘制专业图Chap.III 矩阵转tiff Part.I Introduction 本文汇总了 Matlab 用矩阵画图的几种方式。 Chap.I 预备知识 关于 *.mat 文件 *.mat文件是 matlab 的…

Ribbon组件的负载均衡原理

原因背景 spring cloud的底层负载均衡是采用Ribbon组件&#xff0c;我们将user-service服务注册到eureka-server中&#xff0c;那么当我们在另一个服务的代码层面请求远程调用API接口http://user-service/users/5时&#xff0c;程序代码如何解析远程调用的user-service服务名转…