Как рекомендовано here, я использую пакетные запросы в API Gmail. Я заметил, что фактические запросы становятся довольно большими, поэтому я думал об их сжатии с помощью gzip. Я получил его на работу до того, что я вижу запрос сжат POST происходит на Скрипач, но я получаю сообщение Bad Request назад:Сжатие почтовых запросов, отправленных в API Gmail
<HTML>
<HEAD>
<TITLE>Bad Request</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Bad Request</H1>
<H2>Error 400</H2>
</BODY>
</HTML>
Является ли это просто не поддерживается в API Gmail, или я что-то пропускаю?
Вот код (я использую 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: отредактировал сообщение, чтобы включить код. – gwyers
Прежде всего, используйте клиентскую библиотеку API. Он реализует такие вещи, как компрессия для https://developers.google.com/api-client-library/dotnet/. –