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層的代碼粘貼一下。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章