2012-03-20 23 views
5

Mam starannie czytaną dokumentację Google Contacts API, ale nie mogę poprawnie uzyskać żądań PUT (tj. Aktualizacji). Używam Ruby on Rails 3.2 z gemem OAuth (v0.4.5). Przyniosę znaki z Omniauth a zakres jest definiowany jako „https://www.google.com/m8/feedsGoogle Contacts API: Nieautoryzowany 401 Nieznany nagłówek autoryzacji

Pozwól mi zademonstrować:

ruby-1.9.2-p290 :001 > @access_token.get("https://www.google.com/m8/feeds/contacts/default/full/c1f86b48b52548c", {"GData-Version" => "3.0"}) 
=> #<Net::HTTPOK 200 OK readbody=true> 

Jak widać, GET wnioski działa dobrze więc mój token dostępu OAuth powinno być w porządku. Żądania DELETE działają również:

ruby-1.9.2-p290 :002 > @access_token.delete('https://www.google.com/m8/feeds/contacts/default/full/c1f86b48b52548c', { 'GData-Version' => '3.0', 'If-Match' => '"RH46fTVSLyt7I2A9Wx9VFkgMQAU."' }) 
=> #<Net::HTTPOK 200 OK readbody=true> 

Jak dotąd, tak dobrze. Tutaj podałem Etag wpisu kontaktu w nagłówku żądania zgodnie z instrukcją w dokumentacji Google [1]. Więc nie powinno to sprawiać żadnych kłopotów.

Zgodnie z dokumentacją OAuth gem [2] składnia wniosku PUT powinny być jak następuje:

- (Object) put(path, body = '', headers = {}) 

a przykładem z dokumentacji:

@token.put('/people/123', @person.to_xml, { 'Accept' => 'application/xml', 'Content-Type' => 'application/xml' }) 

O ile mi zrozumieć , Powinienem wysyłać prosty łańcuch XML jako treść żądania PUT. Warto więc pobrać przykładowe dane pierwsza:

ruby-1.9.2-p290 :003 > xmldata = @access_token.get("https://www.google.com/m8/feeds/contacts/default/full/5f74bf0d5c621a", {"GData-Version" => "3.0"}).body 

=> "<?xml version='1.0' encoding='UTF-8'?> 
     <entry xmlns='http://www.w3.org/2005/Atom' xmlns:gContact='http://schemas.google.com/contact/2008' xmlns:batch='http://schemas.google.com/gdata/batch' xmlns:gd='http://schemas.google.com/g/2005' gd:etag='&quot;R3w4fzVSLit7I2A9WhRaGEQCQgc.&quot;'> 
     <id>http://www.google.com/m8/feeds/contacts/my.email%40address.com/base/5f74bf0d5c621a</id> 
     <updated>2012-02-22T08:15:36.237Z</updated> 
     <app:edited xmlns:app='http://www.w3.org/2007/app'>2012-02-22T08:15:36.237Z</app:edited> 
     <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact'/> 
     <title>Joe Average</title> 
     <link rel='http://schemas.google.com/contacts/2008/rel#photo' type='image/*' href='https://www.google.com/m8/feeds/photos/media/my.email%40address.com/5f74bf0d5c621a?v=3.0'/> 
     <link rel='self' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/my.email%40address.com/full/5f74bf0d5c621a?v=3.0'/> 
     <link rel='edit' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/my.email%40address.com/full/5f74bf0d5c621a?v=3.0'/> 
     <gd:name> 
      <gd:fullName>Joe Average</gd:fullName> 
      <gd:givenName>Joe</gd:givenName> 
      <gd:familyName>Average</gd:familyName> 
     </gd:name> 
     <gd:email rel='http://schemas.google.com/g/2005#other' address='[email protected]' primary='true'/> 
     </entry>" 

... i spróbuj zaktualizować go z powrotem do Google:

ruby-1.9.2-p290 :004 > @access_token.put("https://www.google.com/m8/feeds/contacts/default/full/5f74bf0d5c621a", xmldata, {"GData-Version" => "3.0", 'If-Match' => '"R3w4fzVSLit7I2A9WhRaGEQCQgc."'}) 

=> #<Net::HTTPUnauthorized 401 Unknown authorization header readbody=true> 

tak to nie działa. Spróbujmy rozebrać XML trochę tak to będzie wyglądać tak jak w dokumentacji [1]:

xmldata = "<entry gd:etag='&quot;R3w4fzVSLit7I2A9WhRaGEQCQgc.&quot;'> 
      <id>http://www.google.com/m8/feeds/contacts/my.email%40address.com/base/5f74bf0d5c621a</id> 
      <updated>2012-02-22T08:15:36.237Z</updated> 
      <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact'/> 
      <link rel='http://schemas.google.com/contacts/2008/rel#photo' type='image/*' href='https://www.google.com/m8/feeds/photos/media/my.email%40address.com/5f74bf0d5c621a?v=3.0'/> 
      <link rel='self' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/my.email%40address.com/full/5f74bf0d5c621a?v=3.0'/> 
      <link rel='edit' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/my.email%40address.com/full/5f74bf0d5c621a?v=3.0'/> 
      <gd:name> 
       <gd:fullName>Joe Average</gd:fullName> 
       <gd:givenName>Joe</gd:givenName> 
       <gd:familyName>Average</gd:familyName> 
      </gd:name> 
      <gd:email rel='http://schemas.google.com/g/2005#other' address='[email protected]' primary='true'/> 
      </entry>" 

ale bez powodzenia, dokładnie taki sam błąd jak poprzednio.

To tutaj całkowicie utknąłem. Byłbym bardzo wdzięczny za wszelkie wskazówki dotyczące właściwego kierunku.

[1] https://developers.google.com/google-apps/contacts/v3/#updating_contacts

[2] http://rubydoc.info/gems/oauth/0.4.5/OAuth/AccessToken

+0

Możesz spróbować sformatować żądanie w pliku, a następnie wysłać żądanie za pomocą 'curl', aby sprawdzić, czy możesz wykluczyć niektóre z magii, które mogą się wydarzyć. Jedną rzeczą, która wyskakuje jako możliwość, jest to, że niektóre rzeczy mogły zostać zakodowane (np. '"'), które nie powinny być. –

Odpowiedz

0

Spróbuj ustawić nagłówek Content-Type do 'application/atom + xml' w żądaniu PUT. Miałem podobny problem i pomogło mi to.

Powiązane problemy