- 发起http get请求:
void ServersAddressHelper::HttpGetReq(const FString url, const TFunction<void(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)>& Complate)
{
auto Http = &FHttpModule::Get();
TSharedRef<IHttpRequest> Request = Http->CreateRequest();
Request->SetURL(url);
Request->SetVerb("GET");
Request->SetHeader(TEXT("User-Agent"), "X-UnrealEngine-Agent");
Request->SetHeader("Content-Type", TEXT("application/json"));
Request->OnProcessRequestComplete().BindLambda(Complate);
Request->ProcessRequest();
}
- 分析HttpGetReq:在该函数中,传入了2个参数,一个是URL,一个是TFunction的模板函数类型【Complate】;并且Request->OnProcessRequestComplete绑定了【Complate】,意味着,当请求完成时,Complate将会被调用,同时说明,调用ServersAddressHelper::HttpGetReq对于不同的请求,对于请求结果可以通过自定义函数【Complate】,来实现不同的逻辑;从而,把http get请求,接口化,即所有httpGet请求,都可以调用ServersAddressHelper::HttpGetReq,通过定义函数或正则表达式,来实现对请求结果的不同处理
- 使用http get请求:
void ServersAddressHelper::requestPullHallServerList(const TFunction<void(const TArray<FGateServerFile>&)> call)
{
httpGetReq(
UACSettingForLogin::getInstance()->pullServerListUrlForDev,
[call](FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful) {
TArray<FGateServerFile> result;
if (bWasSuccessful && Response && EHttpResponseCodes::IsOk(Response->GetResponseCode()))
{
FString ServerContent = Response->GetContentAsString();
TArray<FString> arrayServer;
ServerContent.ParseIntoArray(arrayServer, TEXT("\n"));
for (FString temp : arrayServer)
{
}
}
call(result);
});
}
- 分析requestPullHallServerList:在该函数中,调用httpGetReq,利用正则表达式,实现了在哪里请求,就在哪里处理结果;好处非常明显,不用额外声明函数去处理结果,也不用跳转查看处理结果的实现。还不用担心别人调用你处理特殊请求的内容,因为没有声明,且正则表达式在调用的函数作用域完成,别人就无法使用
- 对于http get的复用用法,还可以通过声明函数接口,通过c++继承的方式,去重写请求完成后的方法,这也有2种方式:
第一种:直接在真正的逻辑类中,继承接口类【通常是多重继承,因为你的逻辑实现类可能还有基类】,在真正逻辑类中重载实现处理完成get请求的逻辑;
第二种,不在真正逻辑类中,继承;重新声明一个请求类【ClassHttpGet】,并继承http get接口类;然后在声明的类【ClassHttpGet】中,重载实现处理完成get请求的逻辑,可以在真正的逻辑类中,实例化【ClassHttpGet】,也可以专门声明一个网络管理类
PS:提供了3中方式,哪个好,每个人心中都有选择 - 总结:如果想对于某个逻辑函数,需要在调用的时候处理不同的逻辑,且处理的逻辑无法被其他地方复用或者不想暴露调用时,处理逻辑的内容;正则表达式,配合带有类似函数指针的函数,这将时很完美处理的方法