2014-06-26 2 views
14

Die "Try It" -Teildokumentation ermöglicht es mir, die API zu spielen, und der Feldwähler erlaubt mir, viele Felder auszuwählen, z. Header, rohe, etc. Aber keiner von ihnen tatsächlich angezeigt, wenn die API ausprobiert. Das einzige, was ich sah, war immer nur die Nachrichten-ID und die Thread-ID.Gibt es in Gmail API eine Möglichkeit, zusätzliche Felder (z. B. Betreff, Text) in die Nachrichtenlistenmethode aufzunehmen?

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

Z.B. Die folgende:

GET https://www.googleapis.com/gmail/v1/users/{user_id}/messages?**fields=messages(historyId%2Cid%2Cpayload%2Craw%2CsizeEstimate%2Csnippet%2CthreadId)**&key={YOUR_API_KEY} 

Returns:

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

Aber ich würde erwarten, dass die zusätzlichen Felder sind zu angefordert zurückgegeben.

Gibt es eine Möglichkeit, dies zum Laufen zu bringen? Ich weiß, dass es eine separate Methode gibt, um eine einzelne Nachricht zu erhalten, aber wenn möglich, möchte ich sie als Batch erhalten.

+2

Ich denke, sie erwarten, dass Sie die einzelnen Daten in separaten Anfragen erhalten ... – James

Antwort

9

messages.list gibt nicht mehr als nur die Kennungen zurück. nicht sicher, was der Feldwähler ist, aber ich glaube nicht, dass es benutzt wird.

jedoch können Sie eine dosierte message.get verwenden, um dann viele Nachrichten auf einmal in einem zweiten Anruf zurückzuholen: kombiniert in einem HTTP-Anforderung

Eine Batch-Anforderung besteht aus mehreren API-Aufrufe. In diesem Abschnitt wird die Stapelsyntax im Detail beschrieben. später gibt es ein Beispiel.

Hinweis: Ein Satz von n Anfragen, die zusammengelegt werden, zählt als n Anfragen, nicht als eine Anfrage. Die Stapelanforderung wird vor der Verarbeitung in eine Gruppe von Anforderungen zerlegt.

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

Mit der Gmail API und Batch here're einige Beispielcode:

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 
    ... 
}]; 
+0

Danke für das vorschlagen! Es scheint jedoch ein Problem mit diesem Ansatz zu geben. "Hinweis: Ein Satz von n Anfragen, die zusammengelegt werden, zählt als n Anfragen, nicht als eine Anfrage zu Ihrer Nutzungsgrenze. Die Stapelanfrage wird vor der Verarbeitung in eine Reihe von Anfragen zerlegt." Basierend darauf, indem ich 10 Nachrichten schnell (innerhalb von 1 Sekunde) abgeholt habe, hätte ich mich veranlasst, die Grenze von 10 Anfragen pro Sekunde zu überschreiten. – yuklai

+0

Haben Sie es tatsächlich versucht und die 10 Anfragen/Sekunde überschritten oder spekulieren Sie nur? Ich würde es versuchen, bevor du spekulierst. Ich glaube nicht, dass diese Grenze bei einer kurzen Granularität von 1 Sekunde angewendet wird, sondern eher bei einem etwas längeren Fenster. Fühlen Sie sich frei zu antworten, wenn ich falsch liege. –

+0

Fair genug.Nein, ich habe den Batch noch nicht ausprobiert, da ich iOS verwende und es noch kein SDK für die Google Mail-API gibt. Aber ich habe versucht, 50 Anfragen asynchron zu feuern und es beginnt nach ~ 10 zu versagen. Aber ich werde den Stapel versuchen und zurück antworten. – yuklai

0

Bei der Google-Dokumentation durchsuchen, die messages.get Abschnitt verwendet wird, konnte ich alle zurückkehren die Feldwerte über Json mit der Methode getMessage(...).

In der ursprünglichen Anfrage erhalten Sie die id und threadId. Unter Verwendung der ID können wir alle Nachrichten zurückzukehren, indem etwas zu tun, wie so:

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()); 
} 

Die oben ist nicht genauen Code aber, sollten Sie eine Vorstellung davon geben, wie dieses Problem zu nähern.

Verwandte Themen