使用UE4 HttpRequest提交多表单

大部分HTTP库都是支持直接设置多表单字段的,但UE4的HttpRequest比较惨,只能用SetContent设置整个的TArray<uint8>作为请求体,所以想要传多表单就要自己拼。

首先设置Header,Content-Type设置为多表单,并设置boundary:

auto HttpRequest = FHttpModule::Get().CreateRequest();
HttpRequest->SetHeader("Content-Type", TEXT("multipart/form-data; boundary=yourboundary"));
HttpRequest->SetURL(yourUrl);
HttpRequest->SetVerb("POST");

boundary想设什么都行,但要和后面用的统一。

然后拼请求体的数据字段部分:

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里设置的boundary前面多两个横杠

然后拼入文件:

RequestBody += TEXT("--yourboundary\r\nContent-Disposition: form-data; name=\"file\"; "); //分隔行和前缀
RequestBody += TEXT("filename=\"") + FileName + TEXT("\"\r\n\r\n"); //文件名
//开始拼文件,我要传的是文本文件,所以都转成字符串
Buffer.Add(0); //结尾拼/0
const char* BufferData = (const char*)Buffer.GetData();
RequestBody += ANSI_TO_TCHAR(BufferData); //文件内容拼接到RequestBody
RequestBody += TEXT("\r\n--yourboundary--\r\n"); //结尾分隔行

拼文件这步需要注意:由于我传的是文本文件,最后也是用SetContentAsString设置请求体,所以可以把Buffer转成字符串。但如果传的是二进制文件,那Buffer中间可能就有0,这样转成char*时就无法分辨结尾了。这种情况请求体也要直接用TArray<uint8>,然后使用SetContent设置,而不能用FString。

另外,分隔行最后要有两个横杠,注意不要打错。

然后把请求体设置进去,就可以传了:

	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();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值