使用UE4 HttpRequest提交多表单
大部分HTTP库都是支持直接设置多表单字段的但UE4的HttpRequest比较惨只能用SetContent设置整个的TArrayuint8作为请求体所以想要传多表单就要自己拼。首先设置HeaderContent-Type设置为多表单并设置boundaryauto HttpRequest FHttpModule::Get().CreateRequest(); HttpRequest-SetHeader(Content-Type, TEXT(multipart/form-data; boundaryyourboundary)); 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*时就无法分辨结尾了。这种情况请求体也要直接用TArrayuint8然后使用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();