I have to create a template class for parsing http requests. I also have to create delegates that will be fired when a response is received.
in .h file:
template <typename SaveInfo>
class UHttpManager_Base : public UObject
{
DECLARE_EVENT_TwoParams(UHttpManager_Base,FOnPostReceived,const SaveInfo&, const int32 /*ResponseCode*/);
DECLARE_EVENT_TwoParams(UHttpManager_Base,FOnPutReceived,bool,const int32 /*ResponseCode*/);
DECLARE_EVENT_TwoParams(UHttpManager_Base,FOnDeleteReceived,bool,const int32 /*ResponseCode*/);
DECLARE_EVENT_TwoParams(UHttpManager_Base,FOnGetListOfsReceived,const TArray<SaveInfo>&,const int32 /*ResponseCode*/);
DECLARE_EVENT_TwoParams(UHttpManager_Base,FOnGetReceived,const SaveInfo&,const int32 /*ResponseCode*/);
public:
UHttpManager_Base() : HttpModule(&FHttpModule::Get()){}
/*HTTP verbs:*/
/*When process a request it's supposed to be used every delegate when respond is received.*/
FOnPostReceived& Post(const SaveInfo& InfoToPost);
FOnPutReceived& Put(const SaveInfo& InfoToPut);
FOnDeleteReceived& Delete(uint32 IDtoDelete);
FOnGetListOfsReceived& GetListOfSaves();
FOnGetReceived& Get(uint32 IDtoGet);
private:
/** When response is received */
virtual void OnGetTemplateReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful);
/*Post*/
void OnPostReceivedResponse(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful);
FOnPostReceived OnPostReceivedDelegate;
/*Put*/
void OnPutReceivedResponse(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful);
FOnPutReceived OnPutReceivedDelegate;
/*Delete*/
void OnDeleteReceivedResponse(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful);
FOnDeleteReceived OnDeleteReceivedDelegate;
/*GetList*/
void OnGetListOfsReceivedResponse(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful);
FOnGetListOfsReceived OnGetListOfsReceivedDelegate;
/*Get */
void OnGetReceivedResponse(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful);
FOnGetReceived OnGetReceivedDelegate;
in .cpp file
#pragma region Requests
template <typename SaveInfo>
typename UHttpManager_Base<SaveInfo>::FOnPostReceived& UHttpManager_Base<SaveInfo>::Post(const SaveInfo& InfoToPost)
{
TSharedRef<IHttpRequest,ESPMode::ThreadSafe> Request = GetHttpModule()->CreateRequest();
Request->OnProcessRequestComplete().BindUObject(this,&UHttpManager_Base<SaveInfo>::OnPostReceivedResponse);
Request->SetURL(GetFullPathURL());
Request->SetVerb("POST");
Request->SetHeader(GetDefaultHeader().Key,GetDefaultHeader().Value);
Request->SetContentAsString(JsonManager->ChangeSaveJsonAndGetString(InfoToPost));
Request->ProcessRequest();
return OnPostReceivedDelegate;
}
template <typename SaveInfo>
typename UHttpManager_Base<SaveInfo>::FOnPutReceived& UHttpManager_Base<SaveInfo>::Put(const SaveInfo& InfoToPut)
{
TSharedRef<IHttpRequest,ESPMode::ThreadSafe> Request = GetHttpModule()->CreateRequest();
Request->OnProcessRequestComplete().BindUObject(this,&UHttpManager_Base<SaveInfo>::OnPutReceivedResponse);
Request->SetURL(ConcatURLWith(FString::FromInt(InfoToPut.ID))); /*Get the Base URL and append a ID to get the right URL to PUT.*/
Request->SetVerb("PUT");
Request->SetHeader(GetDefaultHeader().Key,GetDefaultHeader().Value);
Request->SetContentAsString(JsonManager->ChangeSaveJsonAndGetString(InfoToPut));
Request->ProcessRequest();
return OnPutReceivedDelegate;
}
template <typename SaveInfo>
typename UHttpManager_Base<SaveInfo>::FOnDeleteReceived& UHttpManager_Base<SaveInfo>::Delete(uint32 IDtoDelete)
{
TSharedRef<IHttpRequest,ESPMode::ThreadSafe> Request = GetHttpModule()->CreateRequest();
Request->OnProcessRequestComplete().BindUObject(this, &UHttpManager_Base<SaveInfo>::OnDeleteReceivedResponse);
Request->SetURL(ConcatURLWith(FString::FromInt(IDtoDelete)));
Request->SetVerb("DEL");
Request->SetHeader(GetDefaultHeader().Key,GetDefaultHeader().Value);
/*No content*/
Request->ProcessRequest();
return OnDeleteReceivedDelegate;
}
template <typename SaveInfo>
typename UHttpManager_Base<SaveInfo>::FOnGetListOfsReceived& UHttpManager_Base<SaveInfo>::GetListOfSaves()
{
TSharedRef<IHttpRequest,ESPMode::ThreadSafe> Request = GetHttpModule()->CreateRequest();
Request->OnProcessRequestComplete().BindUObject(this, &UHttpManager_Base<SaveInfo>::OnGetListOfsReceivedResponse);
Request->SetURL(DefaultURL + FullListURI);
Request->SetVerb("GET");
Request->SetHeader(GetDefaultHeader().Key,GetDefaultHeader().Value);
Request->ProcessRequest();
return OnGetListOfsReceivedDelegate;
}
template <typename SaveInfo>
typename UHttpManager_Base<SaveInfo>::FOnGetReceived& UHttpManager_Base<SaveInfo>::Get(uint32 IDtoGet)
{
TSharedRef<IHttpRequest,ESPMode::ThreadSafe> Request = GetHttpModule()->CreateRequest();
Request->OnProcessRequestComplete().BindUObject(this, &UHttpManager_Base<SaveInfo>::OnGetReceivedResponse);
Request->SetURL(ConcatURLWith(FString::FromInt(IDtoGet)));
Request->SetVerb("GET");
Request->SetHeader(GetDefaultHeader().Key,GetDefaultHeader().Value);
Request->ProcessRequest();
return OnGetReceivedDelegate;
}
template <typename SaveInfo>
void UHttpManager_Base<SaveInfo>::InitJson()
{
TSharedRef<IHttpRequest,ESPMode::ThreadSafe> Request = GetHttpModule()->CreateRequest();
Request->OnProcessRequestComplete().BindUObject(this,&UHttpManager_Base<SaveInfo>::OnGetTemplateReceived);
Request->SetURL(GetFullPathEmptyURL());
Request->SetVerb("GET");
Request->SetHeader(GetDefaultHeader().Key,GetDefaultHeader().Value);
Request->ProcessRequest();
}
#pragma endregion Requests
#pragma region Response
template <typename SaveInfo>
void UHttpManager_Base<SaveInfo>::OnPostReceivedResponse(FHttpRequestPtr Request, FHttpResponsePtr Response,
bool bWasSuccessful)
{
if(bWasSuccessful)
{
OnPostReceivedDelegate.Broadcast(JsonManager->GetSaveFromString(Response->GetContentAsString()),Response->GetResponseCode());
OnPostReceivedDelegate.Clear();
}
}
template <typename SaveInfo>
void UHttpManager_Base<SaveInfo>::OnPutReceivedResponse(FHttpRequestPtr Request, FHttpResponsePtr Response,
bool bWasSuccessful)
{
if(bWasSuccessful)
{
OnPutReceivedDelegate.Broadcast(JsonManager->GetBoolValueFromString(Response->GetContentAsString()),Response->GetResponseCode());
OnPutReceivedDelegate.Clear();
}
}
template <typename SaveInfo>
void UHttpManager_Base<SaveInfo>::OnDeleteReceivedResponse(FHttpRequestPtr Request, FHttpResponsePtr Response,
bool bWasSuccessful)
{
if(bWasSuccessful)
{
OnDeleteReceivedDelegate.Broadcast(JsonManager->GetBoolValueFromString(Response->GetContentAsString()),Response->GetResponseCode());
OnDeleteReceivedDelegate.Clear();
}
}
template <typename SaveInfo>
void UHttpManager_Base<SaveInfo>::OnGetListOfsReceivedResponse(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)
{
if(bWasSuccessful)
{
OnGetListOfsReceivedDelegate.Broadcast(JsonManager->GetSaveListFromString(Response->GetContentAsString()),Response->GetResponseCode());
OnGetListOfsReceivedDelegate.Clear();
}
}
template <typename SaveInfo>
void UHttpManager_Base<SaveInfo>::OnGetReceivedResponse(FHttpRequestPtr Request, FHttpResponsePtr Response,
bool bWasSuccessful)
{
if(bWasSuccessful)
{
OnGetReceivedDelegate.Broadcast(JsonManager->GetSaveFromString(Response->GetContentAsString()),Response->GetResponseCode());
OnGetReceivedDelegate.Clear();
}
}
template <typename SaveInfo>
void UHttpManager_Base<SaveInfo>::OnGetTemplateReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)
{
JsonManager->InitJsonObject(Response->GetContentAsString());
}
#pragma endregion Response
The problem is when I tried to call Post function:
ManagerSubsystem->GetColorManager()->Post(BackgroundColorToSave).AddUObject(this,&UCPP_CreateGuild::OnColorRespondReceived);
I’ve got an error:
ProjectFiles: [LNK2019] unresolved external symbol "public: class UHttpManager_Base<struct FServerColorSaveInfo>::FOnPostReceived & __cdecl UHttpManager_Base<struct FServerColorSaveInfo>::Post(struct FServerColorSaveInfo const &)" (?Post@?$UHttpManager_Base@UFServerColorSaveInfo@@@@QEAAAEAVFOnPostReceived@1@AEBUFServerColorSaveInfo@@@Z) referenced in function "public: void __cdecl UCPP_CreateGuild::OnCreateGuildButtonClicked(void)" (?OnCreateGuildButtonClicked@UCPP_CreateGuild@@QEAAXXZ)
The color manager is just an inheritor of the base class HttpManager_Base, which is being stored in a simple subsystem to be called easy.
/**
*
*/
class UHttpColorManager final : public UHttpManager_Base<FServerColorSaveInfo>
{
public:
UHttpColorManager();
private:
void InitJsonManager() override;
};
inline UHttpColorManager::UHttpColorManager() : UHttpManager_Base()
{
SetDefaultURIAndFullPath("color/");
InitJson();
InitJsonManager();
}
inline void UHttpColorManager::InitJsonManager()
{
SetJsonManager(MakeShareable(new FColorJsonManager()));
}