2014-05-10 8 views
11

Używam biblioteki Python gdata do grupowania usunięć kontaktów, a otrzymuję komunikat "If-Match" lub If-None-Match nagłówek lub wpis atrybut etag wymagany "błąd.Uzyskiwanie "If-Match lub If-None-Match nagłówek lub wpis wymagany atrybut etag" błędy, gdy partia usuwa kontakty

Myślę, że problem zaczął się, gdy musiałem włączyć interfejs API kontaktów w konsoli (która jeszcze kilka dni temu nie była wymagana? *).

EDIT:

To rzeczywiście braku zarówno dla aktualizacji i operacji usuwania. Batched insert działa dobrze.

Próbowałem określając nagłówek If-Match, ale to nadal nie:

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 
) 

stworzył także ticket na stronie projektu, ale wątpię, będzie się tam żadnej uwagi.

EDIT 2:

Stosując metodę Batch z force=True (który po prostu dodaje nagłówek If-Match: *) jest taki sam wynik.

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

* Czy ktoś może to zweryfikować? Nigdy wcześniej nie musiałem go włączać w konsoli, a moja aplikacja mogła bez problemu korzystać z interfejsu API Kontaktów i uważam, że wcześniej nie była dostępna. Byłem zaskoczony, widząc to wczoraj.

+0

iam stoi również ten sam problem, aktualizacje na temat tego problemu –

+0

nie znając szczegółów biblioteki GData, nie należy przekazać instancję custom_headers na życzenie jakoś? A może zainstalować na 'gd_client'? Wątpię, że doda nagłówki po prostu tworząc instancję CustomHeaders. – trendels

+0

Ach tak, dobry połów. To był literówka. Edytowane. – john2x

Odpowiedz

4

Kopiowanie odpowiedź od biletu Google Code.

Zasadniczo należy załączyć metodę klienta Post, aby nieznacznie zmodyfikować kanał żądania. Oto jeden sposób, aby to zrobić bez bezpośredniej modyfikacji źródła biblioteki:

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

Można również określić atrybut etag, aby ominąć to. Działa to w partii żądanie ładowności:

<entry gd:etag="*" > 
    <batch:id>delete</batch:id> 
    <batch:operation type="delete"/> 
    <id> urlAsId </id> 
    </entry> 
Powiązane problemy