He leído detenidamente la documentación de la API de contactos de Google, pero no puedo obtener solicitudes PUT (es decir, actualizaciones) correctas. Estoy usando Ruby on Rails 3.2 con la gema OAuth (v0.4.5). Voy a buscar fichas con OmniAuth y el alcance se define como "https://www.google.com/m8/feeds"Contactos de Google API: no autorizada 401 Cabecera de autorización desconocida
Permítanme demostrar:
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>
Como se puede ver, las peticiones GET funcionan muy bien así que mi token de acceso OAuth debe estar bien. Las solicitudes DELETE también funcionan:
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>
Hasta ahora, todo bien. Aquí proporcioné el Etag de la entrada de contacto en el encabezado de la solicitud, como se indica en la documentación de Google [1]. Por lo tanto, no debería estar causando ningún problema.
De acuerdo con la documentación de OAuth joya [2] la sintaxis de una solicitud PUT debe ser como la siguiente:
- (Object) put(path, body = '', headers = {})
Y un ejemplo de la documentación:
@token.put('/people/123', @person.to_xml, { 'Accept' => 'application/xml', 'Content-Type' => 'application/xml' })
Por lo que yo entiendo , Debería enviar una cadena XML simple como el cuerpo de la solicitud PUT. Así que vamos a buscar unos datos de ejemplo en primer lugar:
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='"R3w4fzVSLit7I2A9WhRaGEQCQgc."'>
<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>"
... y tratar de actualizar de nuevo a 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>
Así que esto no funciona. Vamos a tratar de desmontar el XML un poco por lo que se verá igual que en la documentación [1]:
xmldata = "<entry gd:etag='"R3w4fzVSLit7I2A9WhRaGEQCQgc."'>
<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>"
Pero no hubo suerte, exactamente el mismo error que antes.
Aquí es donde estoy totalmente estancado. Agradecería mucho cualquier pista en la dirección correcta.
[1] https://developers.google.com/google-apps/contacts/v3/#updating_contacts
[2] http://rubydoc.info/gems/oauth/0.4.5/OAuth/AccessToken
Puede intentar formatear la solicitud en un archivo y luego hacer la solicitud con 'curl' para ver si puede descartar algo de la magia que puede estar sucediendo. Una cosa que aparece como una posibilidad es que algunas cosas pueden haber sido codificadas (por ejemplo, '"') que no deberían ser. –