要使用 Unreal Engine Http 模块,我们需要编辑 Build.cs 文件以将该模块作为依赖项包含在内。

新建C++类,选择 父类 UBlueprintAsyncActionBase
这个是异步操作蓝图类,你选不选都无所谓,这个是可以暴露给蓝图用的,如果蓝图使用它会是异步的函数,前提是暴露给蓝图了,

假设我文件名是 XXXAsyncActionBase

public class 模块名 : ModuleRules
{
    public DebrisCloud(ReadOnlyTargetRules Target) : base(Target)
    {
    // ...
        PrivateDependencyModuleNames.Add("HTTP");

如果是插件,也可以添加Json模块

PublicDependencyModuleNames.AddRange(
			new string[]
			{
				"Json","HTTP"
			}
);

在你的XXXAsyncActionBase.cpp 添加引用,

#include "HttpModule.h"
#include "Interfaces/IHttpRequest.h"
#include "Interfaces/IHttpResponse.h"

image-1657742843404

在你的XXXAsyncActionBase.h文件里声明请求方法

//委托,如果想异步执行方法,必须需要委托 这里我们只一个参数,所以是OneParam
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FDResponsDeleget,FString,Data);

/**
 * 
 */
UCLASS()
class DOUYINGTOOLS_API UXXXAsyncActionBase : public UBlueprintAsyncActionBase
{
	GENERATED_BODY()

public:

	//设置临时的参数
	UPROPERTY()
	FString TempUrl;
	UPROPERTY()
	FString TempData;
    
	//声明委托
    //执行成功的执行线委托
	UPROPERTY(BlueprintAssignable)
	FDResponsDeleget OnReqSuccess;
    //执行失败的执行线委托
	UPROPERTY(BlueprintAssignable)
	FDResponsDeleget OnReqFail;
    
/**
*暴露给蓝图 要添加宏 比如 UFUNCTION(BlueprintPure) 而且方法必须有static修饰
*DisplayName 在蓝图里这个节点会显示成这个
*Wordkeys 关键词
*异步工具 是属于什么分类
*/
UFUNCTION(BlueprintCallable, meta = (DisplayName = "发起Http请求", Wordkeys = "http"), Category= "异步工具")
static UXXXAsyncActionBase* HttpReq(FString Url,Fstring Data);

virtual void Activate() override;

然后转到XXXAsyncActionBase.cpp实现该函数

UXXXAsyncActionBase* UXXXAsyncActionBase :: HttpReq(FString Url,Fstring Data)
{

	UXXXAsyncActionBase* NewAab = NewObject<UXXXAsyncActionBase>();
	NewAab->TempUrl = Url;
	NewAab->TempData = Data;
	return NewAab;
}

接着实现 Activate

void UValidationAsyncActionBase::Activate()
{
	//先将委托变量赋值,后续使用
	const FDResponsDeleget TempOnReqSuccess = OnReqSuccess;
	const FDResponsDeleget TempOnReqFail = OnReqFail;
    //创建http模块
    FHttpModule& httpModule = FHttpModule::Get();
    //创建http请求
    TSharedRef<IHttpRequest, ESPMode::ThreadSafe> HttpReq  = httpModule.CreateRequest();
    //设置请求方式
    HttpReq->SetVerb(TEXT("POST"));
    //设置数据类型
    HttpReq->SetHeader(TEXT("Content-Type"), TEXT("application/x-www-form-urlencoded"));
     //设置数据
     FString ReqData = "data="+TempData;
      HttpReq->SetContentAsString(ReqData);
      //设置请求地址
      HttpReq->SetURL(TempUrl);
      //设置回调,它将在HTTP调用完成时执行
       pRequest->OnProcessRequestComplete().BindLambda(
       //把上面的委托放这,以便使用
        [TempOnReqSuccess,TempOnReqFail](
            FHttpRequestPtr pRequest,
            FHttpResponsePtr pResponse,
            bool connectedSuccessfully) mutable {

        if (connectedSuccessfully) {

            // 获取请求的数据内容
            Fstring RepData = HttpReq->GetContentAsString();
            ....//做你想做的
            //返回数据
            TempOnReqSuccess.Broadcast(RepData);
        }
        else {
            switch (pRequest->GetStatus()) {
            case EHttpRequestStatus::Failed_ConnectionError:
                UE_LOG(LogTemp, Error, TEXT("连接失败."));
                TempOnReqFail.Broadcast("返回错误信息");
            default:
                UE_LOG(LogTemp, Error, TEXT("请求失败."));
                TempOnReqFail.Broadcast("返回错误信息");
            }
        }
    });
    
    //提交HTTP请求
    HttpReq->ProcessRequest();
    

}

编译无误打开个蓝图,右键搜索 发起Http请求 会显示 一个异步蓝图