2015-09-12 4 views
1

Как рекомендовано 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 может читать его в порядке, сжатом или несжатом.

+0

gzip поддерживается. Покажите свой код. –

+0

@JayLee: отредактировал сообщение, чтобы включить код. – gwyers

+0

Прежде всего, используйте клиентскую библиотеку API. Он реализует такие вещи, как компрессия для https://developers.google.com/api-client-library/dotnet/. –

ответ

0

В библиотеке клиентов API по-прежнему есть open bug именно об этой проблеме, нет?

И источник содержит следующий комментарий:

// Batch request currently doesn't support GZip. Uncomment when the issue will be resolved. 

Я предполагаю, что оседает это?

Смежные вопросы