Есть ли в API Gmail способ включить дополнительные поля (например, тему, тело) в метод списка сообщений?

#gmail-api

#gmail-api

Вопрос:

Документация по части «Попробуйте» позволяет мне использовать API, а селектор полей позволяет мне выбирать множество полей, например, заголовок, необработанный и т. Д. Но ни одно из них на самом деле не появилось при попытке использования API. Единственное, что я видел, это все еще только идентификатор сообщения и идентификатор потока.

https://developers.google.com/gmail/api/v1/reference/users/messages/list

Например, следующее:

 GET https://www.googleapis.com/gmail/v1/users/{user_id}/messages?**fields=messages(historyId,id,payload,raw,sizeEstimate,snippet,threadId)**amp;key={YOUR_API_KEY}
  

ВОЗВРАТ:

 {
 "messages": [
  {
   "id": "146da54fe3dc089e",
   "threadId": "146da54fe3dc089e"
  },
  {
   "id": "146da41d9486982f",
   "threadId": "146da41d9486982f"
  },
  ...
}
  

Но я ожидаю, что запрошенные дополнительные поля также будут возвращены.

Есть ли способ заставить это работать? Я знаю, что существует отдельный метод получения отдельного сообщения, но хотел бы получить их пакетно, если это возможно.

Комментарии:

1. Я думаю, они ожидают, что вы получите отдельные данные в отдельных запросах…

Ответ №1:

Сообщения.список возвращает не намного больше, чем просто идентификаторы. не уверен, что такое селектор полей, но я не верю, что он используется.

однако вы можете использовать пакетное сообщение.get, чтобы затем получить сразу несколько сообщений во втором вызове:

Пакетный запрос состоит из нескольких вызовов API, объединенных в один HTTP-запрос. В этом разделе подробно описывается синтаксис пакета; позже будет приведен пример.

Примечание: набор из n запросов, собранных вместе, учитывается в вашем пределе использования как n запросов, а не как один запрос. Пакетный запрос разбирается на набор запросов перед обработкой.

Из: https://developers.google.com/storage/docs/json_api/v1/how-tos/batch

С помощью API Gmail и batch вот несколько примеров кода:

 GTLBatchQuery *batchQuery = [GTLBatchQuery batchQuery];

[gmailMessageIds enumerateObjectsUsingBlock:^(NSNumber *messageId, NSUInteger idx, BOOL *stop) {
    GTLQueryGmail *query = [GTLQueryGmail queryForUsersMessagesGet];
    query.userId = self.account.email;
    query.identifier = [NSString stringWithFormat:@"%llx", [messageId unsignedLongLongValue]];
    query.format = kGTLGmailFormatRaw;

    [batchQuery addQuery:query];
}];


[self.gmailService executeQuery:batchQuery completionHandler:^(GTLServiceTicket *ticket, GTLBatchResult *result, NSError *error) {
    NSArray *gmailMessages = result.successes.allValues; // This is an array of GTLGmailMessage objects
    ... 
}];
  

Комментарии:

1. Спасибо, что предложили это! Однако, похоже, есть одна проблема с этим подходом. «Примечание: набор из n запросов, собранных вместе, учитывается в вашем пределе использования как n запросов, а не как один запрос. Пакетный запрос разбирается на набор запросов перед обработкой. » Исходя из этого, быстрая отправка 10 сообщений (в течение 1 секунды) привела бы к превышению лимита в 10 запросов в секунду.

2. Вы действительно пробовали это и превысили лимит в 10 запросов в секунду или вы просто размышляете? Я бы пошел и попробовал, прежде чем строить предположения. Я не верю, что ограничение применяется при такой короткой детализации, как 1 секунда, а скорее усредняет немного более длинное окно. Не стесняйтесь отвечать, если я ошибаюсь.

3. Достаточно справедливо. Нет, я еще не пробовал пакет, так как я использую iOS, а SDK для API gmail еще нет. Но я попытался выполнить 50 запросов асинхронно, и он начинает завершаться сбоем после ~ 10th. Но я попробую пакет и отвечу.

4. Привет, фатшу, библиотеки iOS можно найти здесь: code.google.com/p/google-api-objectivec-client/source/browse/… Надеюсь, в ближайшие несколько часов мы разберемся с этим, чтобы связать его с документами. Является ли 50 запросов асинхронными и сбой после ~ 10 часов неожиданным? Я не понимаю, о чем вы говорите. Какую пропускную способность запросов вы поддерживаете (50 в секунду?)? В чем ошибка (например, 429)?

5. Также обратите внимание, что теперь messages.get() и threads.get() поддерживают параметры format=METADATA и metadataHeaders=[‘from’, ‘to’, ‘subject’, …] . поэтому, когда вы выполняете второй пакетный вызов get(), вы можете запросить только то, что вам нужно, что должно сделать его быстрее / эффективнее (и мы скоро обновим квоту, чтобы отразить это).

Ответ №2:

После просмотра документации Google, используя раздел messages.get, я смог вернуть все значения полей через json, используя метод getMessage(...) .

В исходном запросе вам присваивается id и threadId . Используя идентификатор, мы можем возвращать все сообщения, делая что-то вроде этого:

 ListMessagesResponse mResponse =
            service.users().messages().list(user).execute();

// This will return the json listed with the field methods id and threadId.
List<Message> messages = mResponse.getMessages();

// Parse the response
if(message.size() == 0){...}
else {
  for(Message msg: messages)
    *.getMessage(service,user,msg.getId());
}
  

Приведенное выше не является точным кодом, но должно дать вам представление о том, как подойти к этой проблеме.