如何将HTTP请求体分成两部分?



我对使用HTTPClient和向API发送REST请求相当陌生,我目前正在使用这个Google Drive API端点练习多部分上传:

文章https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart

这里有一个指令,声明将请求体分成两部分,我试图重新创建这个,但无法这样做。

https://developers.google.com/drive/api/guides/manage-uploads多部分

下面是我当前的代码:

async void UploadFile(StorageFile fileName)
{
using (HttpClient client = new HttpClient())
{
// Opens files and convert it to stream
var resultStream = await fileName.OpenReadAsync();
var fileStreamContent = new StreamContent(resultStream.AsStream());
// Create file MetaData
var fileMetaData = JsonConvert.SerializeObject(
new { name = fileName.Name,  mimetype = fileName.ContentType });
// Create POST request
var requestMessage = new HttpRequestMessage(HttpMethod.Post, uploadFileEndpoint);
requestMessage.Headers.Authorization = new AuthenticationHeaderValue(tokenType, accessToken);
// Add request body
requestMessage.Content = new StringContent(fileMetaData, Encoding.UTF8, "application/json");
requestMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("multipart/related");
var response = await client.SendAsync(requestMessage);
string responseString = await response.Content.ReadAsStringAsync();
output(responseString);
}
}

任何帮助将非常感激,谢谢!

根据执行多部分上传(HTTP选项卡)的文档,您需要@Jeremy建议的MultipartFormDataContent

执行/迁移需要做一些事情:

  1. client.DefaultRequestHeaders.Authorization中加入AuthenticationHeaderValue

  2. 创建StreamContent实例,fileStreamContent(您已经完成了)并指定其Headers.ContentType

  3. 创建StringContent实例,stringContent(您已经完成了)

  4. StreamContentStringContent附加到MultipartFormDataContent实例formData中。

  5. 在API文档中指定formDataHeaders.ContentType

  6. formDataawait client.PostAsync(/* API Url */, formData);一起发布

using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(tokenType, accessToken);
// Opens files and convert it to stream
var resultStream = await fileName.OpenReadAsync();
var fileStreamContent = new StreamContent(resultStream.AsStream());

fileStreamContent.Headers.ContentType = new MediaTypeHeaderValue(fileName.ContentType);
// Create file MetaData
var fileMetaData = JsonConvert.SerializeObject(new { name = fileName.Name, mimetype = fileName.ContentType });
var stringContent = new StringContent(fileMetaData, Encoding.UTF8, "application/json");
// Create POST request
MultipartFormDataContent formData = new MultipartFormDataContent();
formData.Add(stringContent, "metadata");
formData.Add(fileStreamContent, "media");
formData.Headers.ContentType = new MediaTypeHeaderValue("multipart/related");
var response = await client.PostAsync(uploadFileEndpoint, formData);
string responseString = await response.Content.ReadAsStringAsync();
}

最新更新