UE4中的HTTP模块封装了libcurl的HTTP功能,很容易实现HTTP下载和上传功能,代码如下
class FHttpRequestTest
{
void Download(const FString& URL)
{
TSharedRef HttpReuest = FHttpModule::Get().CreateRequest();
HttpReuest->SetURL(URL);
HttpReuest->SetVerb(TEXT("GET"));
HttpReuest->SetHeader(TEXT("Content-Type"), TEXT("application/x-www-form-urlencoded"));
HttpReuest->OnProcessRequestComplete().BindRaw(this, &FHttpRequestTest::OnRequestComplete);
HttpReuest->OnRequestProgress().BindRaw(this, &FHttpRequestTest::OnRequestProgress);
HttpReuest->ProcessRequest();
}
void Upload(const FString& URL, const FString& ContentString)//ContentString为需要上传的文件内容,如果不是纯文本就换成TArray类型的参数
{
TSharedRef HttpReuest = FHttpModule::Get().CreateRequest();
HttpReuest->SetURL(URL);
HttpReuest->SetVerb(TEXT("POST"));
HttpReuest->SetHeader(TEXT("Content-Type"), TEXT("application/x-www-form-urlencoded"));
HttpReuest->SetContentAsString(ContentString);//也可以用SetContent,只不过参数要换成TArray
HttpReuest->OnProcessRequestComplete().BindRaw(this, &FHttpRequestTest::OnRequestComplete);
HttpReuest->OnRequestProgress().BindRaw(this, &FHttpRequestTest::OnRequestProgress);
HttpReuest->ProcessRequest();
}
//请求完成
void OnRequestComplete(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded)
{
if (!HttpRequest.IsValid() || !HttpResponse.IsValid())
{
return;
}
else if (bSucceeded && EHttpResponseCodes::IsOk(HttpResponse->GetResponseCode()))
{
//如果是下载请求,可通过这段代码将文件保存
FString Filename = FPaths::GetCleanFilename(HttpRequest->GetURL());
FFileHelper::SaveArrayToFile(HttpResponse->GetContent(), *FString::Printf(TEXT("%s%s"), *FPaths::GameSavedDir(), *Filename));
}
}
//请求进度
void OnRequestProgress(FHttpRequestPtr HttpRequest, int32 BytesSent, int32 BytesReceived)
{
}
};
普通的HTTP请求,GET方式与下载功能一样,POST方式与上传功能一样,在下载功能中,如果不知道下载文件的大小,可通过HttpReuest->SetVerb(TEXT("HEAD"));只请求头的方式获取文件大小,文件大小在头的Content-Length字段中