大部分HTTP庫都是支持直接設(shè)置多表單字段的,但UE4的HttpRequest比較慘,只能用SetContent設(shè)置整個的TArray<uint8>作為請求體,所以想要傳多表單就要自己拼。
首先設(shè)置Header,Content-Type設(shè)置為多表單,并設(shè)置boundary:
auto HttpRequest = FHttpModule::Get().CreateRequest();
HttpRequest->SetHeader("Content-Type", TEXT("multipart/form-data; boundary=yourboundary"));
HttpRequest->SetURL(yourUrl);
HttpRequest->SetVerb("POST");
boundary想設(shè)什么都行,但要和后面用的統(tǒng)一。
然后拼請求體的數(shù)據(jù)字段部分:
FString RequestBody;
FString Boundary = TEXT("--yourboundary\r\nContent-Disposition: form-data; name=");
//拼入單個屬性
FString Field = Boundary + TEXT("\"") + Key + TEXT("\"\r\n\r\n") + Value + TEXT("\r\n");
RequestBody += Field;
這里需要注意,分隔兩個屬性的boundary行要比Header里設(shè)置的boundary前面多兩個橫杠
然后拼入文件:
RequestBody += TEXT("--yourboundary\r\nContent-Disposition: form-data; name=\"file\"; "); //分隔行和前綴
RequestBody += TEXT("filename=\"") + FileName + TEXT("\"\r\n\r\n"); //文件名
//開始拼文件,我要傳的是文本文件,所以都轉(zhuǎn)成字符串
Buffer.Add(0); //結(jié)尾拼/0
const char* BufferData = (const char*)Buffer.GetData();
RequestBody += ANSI_TO_TCHAR(BufferData); //文件內(nèi)容拼接到RequestBody
RequestBody += TEXT("\r\n--yourboundary--\r\n"); //結(jié)尾分隔行
拼文件這步需要注意:由于我傳的是文本文件,最后也是用SetContentAsString設(shè)置請求體,所以可以把Buffer轉(zhuǎn)成字符串。但如果傳的是二進(jìn)制文件,那Buffer中間可能就有0,這樣轉(zhuǎn)成char*時就無法分辨結(jié)尾了。這種情況請求體也要直接用TArray<uint8>,然后使用SetContent設(shè)置,而不能用FString。
另外,分隔行最后要有兩個橫杠,注意不要打錯。文章來源:http://www.zghlxwxcb.cn/news/detail-728824.html
然后把請求體設(shè)置進(jìn)去,就可以傳了:文章來源地址http://www.zghlxwxcb.cn/news/detail-728824.html
HttpRequest->SetContentAsString(RequestBody);
HttpRequest->OnProcessRequestComplete().BindLambda([](FHttpRequestPtr Request, FHttpResponsePtr Response, bool bSuccess)
{
if (Response.IsValid())
{
FString ResponseStr = Response->GetContentAsString();
UE_LOG(LogTemp, Warning, TEXT("Upload Response: %s"), *ResponseStr);
}
else
{
UE_LOG(LogTemp, Error, TEXT("Upload failed"));
}
});
HttpRequest->ProcessRequest();
到了這里,關(guān)于使用UE4 HttpRequest提交多表單的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!