2014-05-10 9 views
11

Sto utilizzando la libreria gdata Python per eseguire eliminazioni batch di contatti, e ottengo solo "If-Match" o l'attributo etag di If-None-Match o l'attributo etag richiesto ".Ottenere "If-Match o If-None-Match intestazione o ingresso attributo etag richiesto" errori durante l'eliminazione batch contatti

Penso che il problema sia iniziato quando ho dovuto abilitare l'API Contatti nella console (che fino a qualche giorno fa non era richiesta? *).

EDIT:

In realtà non riuscendo sia per l'aggiornamento e l'eliminazione di operazioni. L'inserto in batch funziona correttamente.

provato a specificare l'intestazione If-Match, ma è ancora in mancanza:

custom_headers = atom.client.CustomHeaders(**{'If-Match': '*'}) 
request_feed = gdata.contacts.data.ContactsFeed() 
request_feed.AddDelete(entry=contact, batch_id_string='delete') 
response_feed = self.gd_client.ExecuteBatch(
     request_feed, 
     'https://www.google.com/m8/feeds/contacts/default/full/batch', 
     custom_headers=custom_headers 
) 

anche creato un ticket sulla pagina del progetto, ma dubito che permette di scaricare qualsiasi attenzione là.

EDIT 2:

Utilizzando il metodo Batch con force=True (che aggiunge solo l'header If-Match: *) è lo stesso risultato.

response_feed = self.gd_client.Batch(
    request_feed, 
    uri='https://www.google.com/m8/feeds/contacts/default/full/batch', 
    force=True 
) 

* Qualcuno può verificare questo? Non ho mai dovuto abilitarlo nella console prima e la mia app era in grado di utilizzare l'API Contatti senza problemi, e credo che non fosse nemmeno disponibile prima. Sono stato sorpreso di vederlo ieri.

+0

iam anche affrontando lo stesso problema, tutti gli aggiornamenti su questo problema –

+0

senza conoscere i dettagli della biblioteca GData, non si dovrebbe passare l'istanza custom_headers alla richiesta in qualche modo? O magari installarlo su 'gd_client'? Dubito che aggiungerà le intestazioni semplicemente creando un'istanza CustomHeaders. – trendels

+0

Ah sì, buona cattura. Quello era un errore di battitura. Modificato. – john2x

risposta

4

Copia risposta da parte del biglietto di codice di Google.

Fondamentalmente, è necessario patchare il metodo del cliente Post modificare leggermente il feed richiesta. Ecco un modo per farlo senza modificare direttamente la sorgente della libreria:

def patched_post(client, entry, uri, auth_token=None, converter=None, desired_class=None, **kwargs): 
    if converter is None and desired_class is None: 
     desired_class = entry.__class__ 
    http_request = atom.http_core.HttpRequest() 
    entry_string = entry.to_string(gdata.client.get_xml_version(client.api_version)) 
    entry_string = entry_string.replace('ns1', 'gd') # where the magic happens 
    http_request.add_body_part(
     entry_string, 
     'application/atom+xml') 
    return client.request(method='POST', uri=uri, auth_token=auth_token, 
          http_request=http_request, converter=converter, 
          desired_class=desired_class, **kwargs) 

# when it comes time to do a batched delete/update, 
# instead of calling client.ExecuteBatch, instead directly call patched_post 
patched_post(client_instance, entry_feed, 'https://www.google.com/m8/feeds/contacts/default/full/batch') 
0

È inoltre possibile specificare l'attributo ETAG per aggirare l'ostacolo. Questo funziona in batch richiesta di payload:

<entry gd:etag="*" > 
    <batch:id>delete</batch:id> 
    <batch:operation type="delete"/> 
    <id> urlAsId </id> 
    </entry> 
Problemi correlati