0、ue使用http联网下载文件记录
0.1请求 IHttpRequest
首先ue联网使用的类是
IHttpRequest
IHttpRequest | Unreal Engine 5.2 Documentation
Http 请求的接口(使用 FHttpFactory 创建)
这个是请求头
模块是
Module HTTP
Header /Engine/Source/Runtime/Online/HTTP/Public/Interfaces/IHttpRequest.h
Include #include "Interfaces/IHttpRequest.h"
UTextHttp.h
UCLASS(BlueprintType)
class FBXTEXTIMPORT_API UTextHttp : public UObject
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, Category = HTTP)
void DownLoad(FString URL);
//下载完成调用
void HandleDownloadRequest(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded);
//处理下载进度
void HandleHttpRequestProgress(FHttpRequestPtr HttpRequest, int32 BytesSent, int32 BytesReceived);
};
UTextHttp.cpp
void UTextHttp::DownLoad(FString URL) {
TSharedRef<IHttpRequest> HttpRequest = FHttpModule::Get().CreateRequest();//实例化当前平台的新 Http 请求 return新的 Http 请求实例
HttpRequest->OnProcessRequestComplete().BindUObject(this, &UTextBlueprintFunctionLibrary::HandleDownloadRequest); // 一旦请求完成或出现任何错误,将调用的委托
HttpRequest->OnRequestProgress().BindUObject(this, &UTextBlueprintFunctionLibrary::HandleHttpRequestProgress);//每次变动将被调用一次的委托,到目前为止下载了字节
HttpRequest->SetURL(URL);//设置请求url
HttpRequest->SetVerb(TEXT("GET"));//设置请求方式
HttpRequest->ProcessRequest();
/**调用以开始处理请求。
* OnProcessRequestComplete 委托始终在请求完成时调用,如果绑定时出错,则始终调用。
* 请求可以重复使用,但不能在处理过程中重复使用。
*
* @return请求是否成功启动。
**/
}
void UTextHttp::HandleDownloadRequest(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());
//auto a = UrlDecode((char*)(wchar_t*)Filename.GetCharArray()[0]);
//(wchar_t*)Filename.GetCharArray()[0]
FString Left;
FString Right;
FString s;
Filename.Split("%",&Left, &Right);//分割字符串
do
{
FString ls = Right;
s += Left;
if (!ls.Split("%", &Left, &Right))
{
ls.Split(".", &Left, &Right);
}
char lb = Left.GetCharArray()[0]-30;
char hb = ( Left.GetCharArray()[1] - 30) << 4;
/*char b = lb + hb;
UrlDecode(&b);*/
} while (Right.Find("%")!= INDEX_NONE || Right.Find(".")!= INDEX_NONE);
Right = "." + Right;
//s = UTF8_TO_TCHAR(*s);
s += Right;
FString FilePath;
FilePath = FString::Printf(TEXT("%s%s"), *FPaths::ProjectContentDir(), *s);// FPaths::ProjectContentDir() 获得项目的Content目录下 并拼接上文件名称
FFileHelper::SaveArrayToFile(HttpResponse->GetContent(),*FilePath);//将二进制写入文件
}
}
void UTextHttp::HandleHttpRequestProgress(FHttpRequestPtr HttpRequest, int32 BytesSent, int32 BytesReceived) {
//Your code
}
这是我目前使用的方式
0.2响应 IHttpResponse
返回值 | 函数名 | 详细介绍 |
---|---|---|
FString | GetContentAsString() | 假设有效负载为 UTF8,则以字符串形式返回有效负载。 |
int32 | GetResponseCode() | 获取请求的服务器返回的响应代码。 |