2014-06-26 14 views
14

"Try it" bölümü dokümantasyonu API'yi oynatmamı sağlar ve alan seçici çok fazla alan seçmeme izin verir, ör. başlık, ham vb. Ancak hiçbiri API'yi denediğinde aslında görünmedi. Gördüğüm tek şey hala sadece mesaj kimliği ve thread ID idi.İleti listesi yöntemine ek alanlar (ör. Konu, gövde) eklemek için Gmail API'sinde bir yol var mı?

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

Ör

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

İade:

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

Ama istenen ekstra alanlar da döndürülür beklenebilir aşağıdaki.

Bu çalışma için bir yolu var mı? Münferit bir mesaj almak için ayrı bir yöntem olduğunu biliyorum, ancak mümkünse bunları toplu olarak almak gibi.

+2

Ayrı taleplerde bireysel verileri almanızı beklediklerini düşünüyorum ... – James

cevap

9

messages.list yalnızca tanımlayıcılardan çok daha fazla geri dönmez. alan seçicisinin ne olduğundan emin değil ama bunun kullanıldığına inanmıyorum.

sonra ikinci bir çağrı aynı anda birçok mesajları almak için bir batched message.get kullanabilirsiniz ancak:

bir toplu isteğinin tek HTTP isteğinde birleştirilir birden API çağrıları oluşur. Bu bölüm, toplu sözdizimini ayrıntılı olarak açıklar; daha sonra bir örnek var.

Not: Bir araya getirilen bir dizi n istek, tek bir istek olarak değil, n istekleri olarak kullanım sınırınıza doğru sayar. Parti talebi, işlenmeden önce bir takım taleplere ayrılır.

Gönderen: Gmail API ve toplu here're bazı örnek kod ile https://developers.google.com/storage/docs/json_api/v1/how-tos/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 
    ... 
}]; 
+0

Bunu önerdiğiniz için teşekkür ederiz! Ancak bu yaklaşımla ilgili bir sorun var gibi görünüyor. "Not: Bir araya getirilen n istekleri kümesi, bir istek olarak değil, istekler olarak kullanım sınırınıza doğru sayar. Toplu işlem, işlenmeden önce bir dizi isteğin içine alınır." Buna göre, 10 iletiyi (1 saniye içinde) hızlı bir şekilde getirerek, ikinci sınır başına 10 isteği aşmamı sağladı. – yuklai

+0

Gerçekten denediniz mi ve 10 istek/saniye sınırını aştınız mı, yoksa sadece spekülasyon yapıyor musunuz? Spekülasyon yapmadan önce giderim. Sınırın, 1 saniyelik bir tanesellikten daha kısa bir şeye, biraz daha uzun bir pencerenin üzerinde ise bir ortama uygulandığını düşünmüyorum. Yanılıyorsam cevap vermek için çekinmeyin. –

+0

Yeterince adil.Hayır, iOS'u kullanıyorum ve gmail API'sı için henüz SDK bulunmadığımdan bu yana toplu çalışmayı denemedim. Ama asenkronize olarak 50 istek başlatmayı denedim ve 10'dan sonra başarısız olmaya başladı. Ama partiyi deneyeceğim ve cevap vereceğim. – yuklai

0

messages.get bölümünü kullanarak, Google belgelerine gezen üzerine, ben her dönebildi alan değerleri getMessage(...) yöntemini kullanarak json yoluyla.

Orijinal istekte size id ve threadId verilir. id kullanarak biz şöyle bir şey yaparak tüm iletileri geri dönebilirler:

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

yukarıda bu sorunu nasıl yaklaşılması konusunda size fikir vermelidir, tam kodu değil ama.