用于获取消息的Gmail API批量请求返回401(需要登录)

时间:2018-02-16 12:12:01

标签: c# google-api gmail-api google-api-dotnet-client

我正在尝试编写一些代码,使用记录在案here的Gmail API从Gmail获取电子邮件。我已成功设法检索电子邮件列表,并获取各个电子邮件的详细信息。

我现在要做的是使用BatchRequest在一次通话中获取多封电子邮件的详细信息,但是当我尝试这个时,我收到401错误消息:

  

Google.Apis.Requests.RequestError需要登录[401]错误[     消息[需要登录]位置[授权 - 标题]   原因[必填]域名[全球]]

在下面课程的GetMessageInfo方法中,有三次API调用:

  1. Messages.List这成功返回消息列表
  2. Messages.Get这会成功返回单条消息的详细信息
  3. 最后,我尝试使用与步骤2中相同的Messages.Get,但这次使用BatchRequest,但由于上述错误而失败。
  4. 我每次都使用相同的服务对象,并且在步骤2& 3,我使用相同的请求。

    问题:为什么我可以通过单个请求获取邮件详细信息,但不能作为批量请求的一部分?

    public class ProofOfConcept
    {
      public void GetMessageInfo()
      {
        GmailService service = GetService();
    
        UsersResource.MessagesResource.ListRequest request = service.Users.Messages.List("me");
        request.MaxResults = 1;
    
        ListMessagesResponse response = request.Execute();
        Message message = response.Messages.First();
    
        Message fullMessageBySingleRequest = PerformSingleRequest(service, message.Id);
        Message fullMessageByBatchRequest = PerformBatchRequest(service, message.Id, out RequestError error);
      }
    
      private Message PerformSingleRequest(GmailService service, string messageId)
      {
        UsersResource.MessagesResource.GetRequest request = service.Users.Messages.Get("me", messageId);
        Message message = request.Execute();
    
        return message;
      }
    
      private Message PerformBatchRequest(GmailService service, string messageId, out RequestError err)
      {
        UsersResource.MessagesResource.GetRequest messageRequest = service.Users.Messages.Get("me", messageId);
    
        var batchRequest = new BatchRequest(service);
    
        Message message = null;
        RequestError requestError = null;
    
        batchRequest.Queue<Message>(
          messageRequest,
          (content, error, i, msg) =>
          {
            message = content;
            requestError = error;
          });
    
        batchRequest.ExecuteAsync().Wait();
    
        err = requestError;
        return message;
      }
    
      private GmailService GetService()
      {
        UserCredential credential;
    
        using (var stream = new FileStream(
          @".\ClientSecret\client_secret.json", 
          FileMode.Open, 
          FileAccess.Read))
        {
          string credPath = Environment.GetFolderPath(
            Environment.SpecialFolder.Personal);
    
          credPath = Path.Combine(
            credPath, 
            ".credentials/gmail-dotnet-quickstart.json");
    
          credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
              GoogleClientSecrets.Load(stream).Secrets,
              new[] {GmailService.Scope.GmailReadonly},
              "user",
              CancellationToken.None,
              new FileDataStore(credPath, true))
            .Result;
        }
    
        // Create Gmail API service.
        var service = new GmailService(new BaseClientService.Initializer
        {
          HttpClientInitializer = credential,
          ApplicationName = "Foo"
        });
    
        return service;
      }
    }
    

1 个答案:

答案 0 :(得分:0)

好的,这对评论来说很重要。

对于初学者,我从未打扰过使用Google apis进行批处理。代码linked我从来没有正常工作( Imo没有代码的错误),我已经尝试了几个Google API(分析和驱动)。我从未发现Google批处理终点非常稳定。如果批处理请求中的一个请求失败或者速度慢,那么它们都会失败,您将收到500错误。

其次,使用批处理IMO,你真的不会赢得任何东西。配额命中将是相同的。一次发送一个请求并发送一个具有相同五个请求的批处理仍将是五个针对您的配额。此外,您可以在批量请求中放入多少请求,这取决于API。你不能在批量请求中提出100个请求我认为限制更像是10。

你唯一可能获胜的是服务器上的来回,如果你有更快的互联网连接应该不重要。

如果您真的想花时间进行批处理工作,请说清楚我会很高兴再试一次。我认为你应该考虑枯萎它值得你花时间。