【发布时间】:2015-12-08 21:55:27
【问题描述】:
按照here 的建议,我在 Gmail API 中使用批处理请求。我注意到实际的请求变得非常大,所以我想用 gzip 压缩它们。 我已经让它工作到我看到压缩的 POST 请求在 Fiddler 上发出,但我收到了错误的请求消息:
<HTML>
<HEAD>
<TITLE>Bad Request</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Bad Request</H1>
<H2>Error 400</H2>
</BODY>
</HTML>
Gmail API 根本不支持这一点,还是我忽略了什么?
这是代码(我使用的是 C#,如您所见):
private static async Task<StreamContent> CompressedContent(HttpContent content)
{
System.IO.MemoryStream ms = new System.IO.MemoryStream();
using (System.IO.Compression.GZipStream gzip = new System.IO.Compression.GZipStream(ms,
System.IO.Compression.CompressionMode.Compress, true))
{
await content.CopyToAsync(gzip).OnThreadPool();
await gzip.FlushAsync();
}
ms.Position = 0;
StreamContent streamContent = new StreamContent(ms);
streamContent.Headers.ContentType = content.Headers.ContentType;
streamContent.Headers.Add("Content-Encoding", "gzip");
return streamContent;
}
private async Task<string> GetResponseItemResult(string batchUri, MultipartContent cont, bool compressed = false)
{
using (var httpClient = new HttpClient(new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip }))
using (var request = new HttpRequestMessage
{
RequestUri = new Uri(batchUri),
Method = HttpMethod.Post
})
{
if (compressed)
request.Content = await CompressedContent(cont);
else
request.Content = cont;
//Authentication stuff removed
//...
HttpResponseMessage responseMessage = await httpClient.SendAsync(request).OnThreadPool();
//Error handling removed
//...
return await responseMessage.Content.ReadAsStringAsync();
}
}
如果我不使用压缩,而是直接传递内容,它可以正常工作。 如前所述,实际内容是一个批处理请求,Fiddler 可以很好地读取它,压缩或未压缩。
【问题讨论】:
-
支持 gzip。显示您的代码。
-
@JayLee:编辑帖子以包含代码。
-
首先,使用 API 客户端库。它为你实现了压缩之类的东西developers.google.com/api-client-library/dotnet。
标签: gmail-api google-api-dotnet-client