UE Http笔记

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 OneDECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FDownloadProgressDelegate,const int32&, ReceivedDataInBytes,const int32&, TotalDataInBytes,const TArray<uint8>&, BinaryData
);
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FDownloadDelegate);#pragma endregion#pragma region TwoUENUM(BlueprintType)
enum class EPTRequestVerb : uint8
{GET,POST
};#pragma endregion
/****/
UCLASS()
class PIECETOGETHERTOOLS_API UAsyncHttpObject : public UBlueprintAsyncActionBase
{GENERATED_BODY()public:#pragma region OneUFUNCTION(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 TwoUFUNCTION(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;}//设置URLrequest->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(); // 手动GCreturn AsyncHttpObject;}void UAsyncHttpObject::AsyncRequestHandle(FHttpRequestPtr request, FHttpResponsePtr response, bool bWasSuccessful)
{RemoveFromRoot(); // 手动GCif (bWasSuccessful && response.IsValid() && EHttpResponseCodes::IsOk(response->GetResponseCode())){// 获得返回的json数据TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(response->GetContentAsString());// 把FString转成TCHARTCHAR* serializedChar = response->GetContentAsString().GetCharArray().GetData();// 解决中文乱码问题,服务端也是utf-8TCHAR_TO_UTF8(serializedChar);FString myData(serializedChar);// 创建Json对象TSharedPtr<FJsonObject> JsonObject;// 反序列化jsonbool 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..hUFUNCTION(BlueprintCallable, Category = "Vince | AsyncHttp", meta = (WorldContext = "WorldContextObject"))
static	void XieJson(FString& outjsonStr, const UObject* WorldContextObject);.cppvoid 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转成TCHARTCHAR* serializedChar = response->GetContentAsString().GetCharArray().GetData();// 解决中文乱码问题,服务端也是utf-8TCHAR_TO_UTF8(serializedChar);FString myData(serializedChar);// 创建Json对象TSharedPtr<FJsonObject> JsonObject;// 反序列化jsonbool 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.mzph.cn/news/205634.shtml

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

相关文章

webpack学习-3.管理输出

webpack学习-3.管理输出 1.简单练手2.设置 HtmlWebpackPlugin3.清理 /dist 文件夹4.manifest5.总结 1.简单练手 官网的第一个预先准备&#xff0c;是多入口的。 const path require(path);module.exports {entry: {index: ./src/index.js,print: ./src/print.js,},output: …

axios调接口传参特殊字符丢失的问题(encodeURI 和 encodeURIComponent)

1、axios调接口特殊字符丢失的问题 项目开发过程中遇到一个接口传参&#xff0c;参数带特殊字符&#xff0c;axios调接口特殊字符丢失的问题 例如接口&#xff1a; get/user/detail/{name} name是个参数直接调接口的时候拼到接口上&#xff0c;get/user/detail/test123#$%&am…

华为配置Smart Link负载分担示例

Smart Link基本概念 Smart Link通过两个端口相互配合工作来实现功能。这样的一对端口组成了一个Smart Link组。为了区别一个Smart Link组中的两个端口&#xff0c;我们将其中的一个叫做主端口&#xff0c;另一个叫做从端口。同时我们利用Flush报文、Smart Link实例和控制VLAN等…

Matlab 点云曲线探测(算法不稳定,仅用于学习)

文章目录 一、简介二、实现代码三、实现效果参考文献一、简介 这是一个很有趣的曲线探测的方法,不过我没有复现出论文中那样的效果,可能是理解有误,但这个算法仍然是很有意思,故这里也对其进行记录。 按照论文中的思路,首先我们需要通过一种线性强度图来计算确定每个点的法…

Java网络编程,使用UDP实现TCP(一), 基本实现三次握手

简介&#xff1a; 首先我们需要知道TCP传输和UDP传输的区别&#xff0c;UDP相当于只管发送不管对方是否接收到了&#xff0c;而TCP相当于打电话&#xff0c;需要进行3次握手&#xff0c;4次挥手&#xff0c;所以我们就需要在应用层上做一些功能添加&#xff0c;如&#xff1a;…

Bounding boxes augmentation for object detection

Different annotations formats Bounding boxes are rectangles that mark objects on an image. There are multiple formats of bounding boxes annotations. Each format uses its specific representation of bouning boxes coordinates 每种格式都使用其特定的边界框坐标…

案例060:基于微信小程序考试系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

01-SDV软件定义汽车思考

前言&#xff1a; 随着汽车产业“新四化”(电动化、网联化、智能化、共享化)的加速推动&#xff0c;智能汽车已成为各国科技发展战略重点&#xff0c;在社会数字化转型的浪潮下逐渐形成跨领域协作、多技术融合的汽车产业新赛道。 软件定义汽车已成为行业趋势与共识&#xff…

class037 二叉树高频题目-下-不含树型dp【算法】

class037 二叉树高频题目-下-不含树型dp【算法】 code1 236. 二叉树的最近公共祖先 // 普通二叉树上寻找两个节点的最近公共祖先 // 测试链接 : https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/ package class037;// 普通二叉树上寻找两个节点的最近…

HashMap系列-resize

1.resize public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable {final Node<K,V>[] resize() {Node<K,V>[] oldTab table;int oldCap (oldTab null) ? 0 : oldTab.length; //老的数组容量in…

RabbitMQ学习二

RabbitMQ学习二 发送者的可靠性生产者连接重试机制生产者确认机制开启生产者确认定义ReturnCallback定义confirmCallback MQ的可靠性交换机和队列持久化消息持久化LazyQueue控制台配置Lazy模式代码配置Lazy模式 消费者的可靠性失败重试机制失败处理策略业务幂等性唯一消息ID业务…

AI人工智能在电子商务领域的运用

电子商务领域和个性化新时代的 AI 随着整个社会追求便利性&#xff0c;并且逐渐从传统的实体零售模式转向网购模式&#xff0c;在线零售商必须改变与客户的互动方式。为每个客户提供个性化购物体验的理念一直都存在&#xff0c;但是现在我们正式进入了个性化新时代。这是一个包…

Docker网络原理及Cgroup硬件资源占用控制

docker的网络模式 获取容器的进程号 docker inspect -f {{.State.Pid}} 容器id/容器名 docker初始状态下有三种默认的网络模式 &#xff0c;bridg&#xff08;桥接&#xff09;&#xff0c;host&#xff08;主机&#xff09;&#xff0c;none&#xff08;无网络设置&#xff…

【flink番外篇】1、flink的23种常用算子介绍及详细示例(2)- keyby、reduce和Aggregations

Flink 系列文章 1、Flink 专栏等系列综合文章链接 文章目录 Flink 系列文章一、Flink的23种算子说明及示例6、KeyBy7、Reduce8、Aggregations 本文主要介绍Flink 的3种常用的operator&#xff08;keyby、reduce和Aggregations&#xff09;及以具体可运行示例进行说明. 如果需要…

【vtkWidgetRepresentation】第五期 vtkLineRepresentation

很高兴在雪易的CSDN遇见你 内容同步更新在公众号“VTK忠粉” 【vtkWidgetRepresentation】第五期 一条直线的交互 前言 本文分享vtkLineRepresentation&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会继续努力分享&#xf…

Presto:基于内存的OLAP查询引擎

PrestoSQL查询引擎 1、Presto概述1.1、Presto背景1.2、什么是Presto1.3、Presto的特性2、Presto架构2.1、Presto的两类服务器2.2、Presto基本概念2.3、Presto数据模型3、Presto查询过程3.1、Presto执行原理3.2、Presto与Hive3.3、Presto与Impala3.4、PrestoDB与PrestoSQL4、Pre…

Libavutil详解:理论与实战

文章目录 前言一、Libavutil 简介二、AVLog 测试1、示例源码2、运行结果 三、AVDictionary 测试1、示例源码2、运行结果 四、ParseUtil 测试1、示例源码2、运行结果 前言 libavutil 是一个实用库&#xff0c;用于辅助多媒体编程&#xff0c;本文记录 libavutil 库学习及 demo 例…

智能优化算法应用:基于战争策略算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于战争策略算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于战争策略算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.战争策略算法4.实验参数设定5.算法结果6.参考…

对比两阶段提交,三阶段协议有哪些改进?

本文我们来讨论两阶段提交和三阶段提交协议的过程以及应用。 在分布式系统中&#xff0c;各个节点之间在物理上相互独立&#xff0c;通过网络进行沟通和协调。在关系型数据库中&#xff0c;由于存在事务机制&#xff0c;可以保证每个独立节点上的数据操作满足 ACID。但是&…

WMMSE方法的使用笔记

标题很帅 原论文的描述WMMSE的简单应用 无线蜂窝通信系统的预编码设计问题中&#xff0c;经常提到用WMMSE方法设计多用户和速率最大化的预编码&#xff0c;其中最为关键的一步是将原和速率最大化问题转化为均方误差最小化问题&#xff0c;从而将问题由非凸变为关于三个新变量的…