UE4_ 使用 ue4c++ 以Http方式与服务器交互

客户端与服务器的交互,在ue4 中提供了一个插件,可以以蓝图的方式使用该插件。参考链接

本文提供的是基于UserWidget类,用c++代码实现。里边涉及的有Http请求,Json数据处理,中文乱码解决。

正文:

新建一个ue4 c++ 工程,基于Userwidget c++类创建一个NetWidget。别忘了自己搞定一个番茄插件,不然头文件引用自己想办法解决。

NetWidget.h 文件如下

#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "IHttpRequest.h"
#include "NetWidget.generated.h"


/**
 * 
 */
UCLASS()
class FRAMECOURSE_API UNetWidget : public UUserWidget
{
	GENERATED_BODY()

	UFUNCTION(BlueprintCallable, Category = "Network")
		void SendMsgToServer(FString name, FString password);

	
	void RequestComplete(FHttpRequestPtr RequestPtr, FHttpResponsePtr ResponsePtr, bool bIsSuccess);
	
};

NetWidget.cpp

#include "NetWidget.h"
#include "CondensedJsonPrintPolicy.h"
#include "HttpModule.h"
#include "IHttpRequest.h"
#include "IHttpResponse.h"
#include "JsonReader.h"
#include "JsonObject.h"
#include "JsonSerializer.h"
#include "Common/FWCommon.h"      // 这个是我自己封装的工具类,打印信息用的,没有就用系统自带的




void UNetWidget::SendMsgToServer(FString name, FString password)
{
	
	FString server_data;
	// 创建json
	// TSharedRef<TJsonWriter<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>> JsonWriter = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>::Create(server_data);
	TSharedRef<TJsonWriter<TCHAR, TPrettyJsonPrintPolicy<TCHAR>>> JsonWriter = TJsonWriterFactory<TCHAR, TPrettyJsonPrintPolicy<TCHAR>>::Create(&server_data);
    // 开启json 写入
	JsonWriter->WriteObjectStart();
	 写入数据
	JsonWriter->WriteValue("name", name);
	JsonWriter->WriteValue("password", password);
	
	 关闭写入
	JsonWriter->WriteObjectEnd();
	 关闭Json 写入
	JsonWriter->Close();
	
	// 创建Http 请求
	TSharedRef<IHttpRequest> Request = FHttpModule::Get().CreateRequest();
	// 设置请求头
	Request->SetHeader("Content-Type","text/javascript;charset=utf-8");
	// 设置请求方式
	Request->SetVerb("POST");
	// 请求的链接
	Request->SetURL("192.168.5.21:8000/test_ue4"); // 服务端预留的测试接口
	// 内容包
	//Request->SetContentAsString(server_data);
	// 设置回调函数
	Request->OnProcessRequestComplete().BindUObject(this, &UNetWidget::RequestComplete);
	// 发送请求
	Request->ProcessRequest();
}

void UNetWidget::RequestComplete(FHttpRequestPtr RequestPtr, FHttpResponsePtr ResponsePtr, bool bIsSuccess)
{
	if (!EHttpResponseCodes::IsOk(ResponsePtr->GetResponseCode())) return;

	// 获得返回的json数据
	TSharedRef<TJsonReader<TCHAR>> JsonReader = TJsonReaderFactory<TCHAR>::Create(ResponsePtr->GetContentAsString());
	// 把FString转成TCHAR
	TCHAR* serializedChar = ResponsePtr->GetContentAsString().GetCharArray().GetData();
	// 解决中文乱码问题,服务端也是utf-8
	TCHAR_TO_UTF8(serializedChar);
	FString myData(serializedChar);
	// 打印信息
	FWHelper::Debug(myData);
	// 创建Json对象
	TSharedPtr<FJsonObject> JsonObject;
	// 反序列化json
	bool bIsOk = FJsonSerializer::Deserialize(JsonReader, JsonObject);
	// 判断是否反序列化成功
	if (bIsOk)
	{
		FString data = JsonObject->GetStringField("data");
		FWHelper::Debug(data);
		}
}

代码粘贴完毕,不代表***完事大吉***,还要在项目中引入相应的模块。在项目名称.Build.cs 中添加相应的模块,比如***json,http***

using UnrealBuildTool;

public class FrameCourse : ModuleRules
{
	public FrameCourse(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
	
		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore","UMG","Http","Json", "JsonUtilities" });

		PrivateDependencyModuleNames.AddRange(new string[] { "Http", "Json", "JsonUtilities" });

		// Uncomment if you are using Slate UI
		// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
		
		// Uncomment if you are using online features
		// PrivateDependencyModuleNames.Add("OnlineSubsystem");

		// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
	}
}

服务器端是用python的django框架,这个自己去学习把,只把view层的代码粘贴一下。

在这里插入图片描述

  • 11
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值