我对使用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
。
执行/迁移需要做一些事情:
-
在
client.DefaultRequestHeaders.Authorization
中加入AuthenticationHeaderValue
-
创建
StreamContent
实例,fileStreamContent
(您已经完成了)并指定其Headers.ContentType
。 -
创建
StringContent
实例,stringContent
(您已经完成了)。 -
将
StreamContent
和StringContent
附加到MultipartFormDataContent
实例formData
中。 -
在API文档中指定
formData
的Headers.ContentType
。 -
将
formData
与await 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();
}