2011-12-23 16 views
5

Ricevo l'errore dell'API grafico n. 613 (messaggio: "Calls to mailbox_fql have exceeded the rate of 300 calls per 600 seconds", tipo: OAuthException) durante il test della mia app. È un'app desktop e l'unica copia è quella in esecuzione sulla mia macchina (quindi c'è solo uno access_token e un utente - me).Errore: "Le chiamate a mailbox_fql hanno superato la velocità di 300 chiamate per 600 secondi"

Interroga l'endpoint inbox una volta ogni 15 secondi circa. Combinata, l'app effettua circa 12 chiamate API (a diversi endpoint) al minuto. Non riesce costantemente su qualsiasi chiamata recupera il thread 300 (ci sono circa 25 thread nella prima pagina dell'endpoint inbox e sto recuperando solo la prima pagina). Non sto effettuando chiamate in batch all'API Graph.

Sto sviluppando su Mac OS X 10.7 utilizzando Objective-C. Io uso NSURLConnection per chiamare l'API Graph in modo asincrono. Per quanto ne so, ogni richiesta elaborata da NSURLConnection dovrebbe comportare solo una richiesta all'API di Facebook.

Continuando a quanto sopra, ho difficoltà a capire perché sto ricevendo questo errore. Sospetto che sia perché una singola chiamata all'endpoint inbox (, ad esempio una chiamata all'URI https://graph.facebook.com/me/inbox?access_token=...) viene conteggiata come più di una chiamata a mailbox_fql. In particolare, penso che una singola chiamata che restituisce < n thread > conta come <n> chiamate contro mailbox_fql. In questo caso, esiste un modo per ridurre il numero di chiamate a mailbox_fql per chiamata API (, ad esempio, recuperando solo i thread più recenti nella cartella Posta in arrivo, anziché nella prima pagina intera, solo per n >?

La documentazione sembra essere piuttosto scarna su questo argomento, quindi ho dovuto passare per lo più attraverso tentativi ed errori. Sarei elettrizzato se qualcun altro sapesse come affrontare questo problema.

risposta

4

Modifica: Si scopre che è possibile passare un parametro GET limit che, non sorprende, limita il numero di risultati. Tuttavia, lo Developer blog nota alcune limitazioni con questo approccio (vale a dire che potrebbero essere restituiti meno risultati di quelli richiesti se alcuni non sono visibili all'utente).

Il blog consiglia di utilizzare until e/o since come parametri GET quando si chiama l'API Graph standard. Questi parametri prendono qualsiasi stringa compatibile con strtotime() (o tempo di epoca Unix) e limitano i risultati di conseguenza.

risposta originale segue:

Dopo ulteriori ricerche, sembra che le mie opzioni sono per andare a prendere meno frequentemente o utilizzare le query FQL personalizzato per limitare il numero di chiamate al mailbox_fql. Non sono stato in grado di trovare alcun modo per limitare la risposta della chiamata standard Graph API all'endpoint inbox. Nella fattispecie, sto usando una query FQL della forma seguente:

https://graph.facebook.com/fql?q=SELECT <fields> FROM thread WHERE folder_id=1 LIMIT <n>&access_token=... 

<fields> è un elenco separato da virgole di campi (descritti nei documenti filo FQL di Facebook). thread è il nome letterale della tabella corrispondente all'endpoint inbox; il nuovo endpoint thread corrisponde alla tabella unified_thread, ma non è ancora disponibile pubblicamente. folder_id=1 indica che vogliamo utilizzare la Posta in arrivo (a differenza delle cartelle Posta in uscita o Aggiornamenti).

In pratica, sto impostando <n> su 5, il che si traduce in una ragionevole 200 chiamate a mailbox_fql in un intervallo di 10 minuti quando si utilizzano intervalli di chiamata di 15 secondi. Nei miei test, non ho ricevuto l'errore n. 613, quindi credo che funzioni.

Immagino che la maggior parte delle persone qui avesse già familiarità con i dettagli di FQL, ma per me era una novità. Spero che questo aiuti alcuni altri neofiti che si occupano di problemi simili!