Usar cURL para interagir com os serviços de dados do Google

Aviso: esta página é sobre as APIs mais antigas do Google, as APIs de dados do Google. Relevante apenas para as APIs listadas no diretório das APIs de dados do Google, muitas delas foram substituídas por APIs mais recentes. Para mais informações sobre uma nova API específica, consulte a documentação da nova API. Para informações sobre autorização de solicitações com uma API mais recente, consulte Autenticação e autorização de Contas do Google.

Ryan Boyd, Equipe de APIs de dados do Google
Setembro de 2007

Introdução

Em essência, as APIs de dados do Google usam feeds e entradas Atom (XML) como um formato de dados, e HTTP como um protocolo para transmissão de dados, estendendo o protocolo Atom Publishing. Publicamos várias bibliotecas de cliente para facilitar a interação com as APIs de dados do Google. No entanto, você pode usar ferramentas de nível inferior para trabalhar com nossos serviços, e é muito fácil fazer isso com um pouco de orientação.

O cURL é um aplicativo de linha de comando usado para realizar solicitações usando uma variedade de protocolos, incluindo o HTTP. O cURL é usado com frequência por desenvolvedores para testar serviços de dados do Google, porque é compatível com a funcionalidade HTTP necessária para interagir com as APIs em um nível baixo.

O cURL só oferece suporte à comunicação HTTP. Portanto, o conhecimento sobre o protocolo de dados do Google, o protocolo específico do serviço e o formato de dados XML usado é um pré-requisito para trabalhar com o aplicativo. Algumas outras ferramentas são mencionadas neste artigo para facilitar essas tarefas.

Este artigo usa exemplos baseados na API de dados dos Álbuns da web do Picasa. No entanto, todos esses exemplos podem ser aplicados facilmente a outras APIs de dados do Google.

Como obter e instalar o cURL

O cURL normalmente está disponível na instalação padrão de muitas plataformas UNIX/Linux. Tente digitar curl no shell favorito para ver se a ferramenta está instalada e está no PATH. Se você não tiver a ferramenta instalada, acesse a página de download no site do cURL para ver a fonte oficial ou um pacote binário criado pelo usuário. Observe que a ferramenta de linha de comando usa a biblioteca libcurl, que pode ser oferecida como um pacote de download separado. Portanto, se você não estiver compilando da origem, faça o download de um pacote "binário" em vez de um pacote "libcurl". Os pacotes ativados por SSL serão necessários se você quiser usar o cURL para adquirir tokens de autenticação ou acessar alguns serviços de dados do Google que exigem o uso do SSL para solicitações.

Como autenticar em um serviço de dados do Google

As solicitações de dados do Google autenticadas são realizadas com a adição de um cabeçalho HTTP à solicitação. Esse cabeçalho contém um token de autenticação ClientLogin (apps para computador/dispositivo móvel) ou XPN (apps da Web). Para fins de teste usando cURL, ClientLogin é o método mais fácil e está documentado abaixo. Os cabeçalhos de autenticação tmp podem ser usados com cURL, mas o processo mais avançado para conseguir os tokens está fora do escopo deste artigo.

Como usar o ClientLogin

O ClientLogin é destinado a aplicativos instalados (computador/móvel). Com esse método de autenticação, o aplicativo que usa as APIs de dados do Google lida diretamente com o nome de usuário e a senha do usuário.

Uma solicitação de autenticação para ClientLogin recebe um nome de usuário, uma senha e um nome de serviço como variáveis de postagem de formulário. Essas variáveis são transmitidas como os argumentos Email, Passwd e service, respectivamente. Essa solicitação gera uma resposta com vários tokens. Um deles pode ser usado para fazer solicitações ao serviço de dados do Google. Os argumentos de dados transmitidos com curl precisam ser codificados em URL se tiverem caracteres não ASCII, que geralmente aparecem nos argumentos Email e Passwd. É possível solicitar que curl codifique esses URLs com URL usando a sinalização --data-urlencode.

Exemplo de solicitação:

curl https://www.google.com/accounts/ClientLogin \
--data-urlencode Email=brad.gushue@example.com --data-urlencode Passwd=new+foundland \
-d accountType=GOOGLE \
-d source=Google-cURL-Example \
-d service=lh2

Exemplo de resposta:

SID=DQAAAHYBADCv2pSv7nflacDNwz3zEDUGtrSvNVDcpkSfddi77b3U5sEaHmP8YLWhmA36F9rk85mL8J5dqo4apn0T1vKz0fPGI9Xtnuet6cuE2ZzYvrNIwbSC_HjTqF4zudNQnnlDuD2wqZT-g1qXI8KhGAQZV4NexHZoQPlabTsGuRZeIBxj1A
LSID=EUBBBIaBADCl-kNxvRVmcQghpt3cqSMfEooKR9flLOUZqwgP9OrZS83gse-KSdTNeXhxsET7FYenDhceP9lIPOmesH-t9qh-AWUHjjMdZEbUNeF9mWyzln6Z-FajaiG-cVFkqW0ZJ8ZbnCP30xXj6xFK6QxaAcqy_9Pej8jhEnxS9E61ftQGPg
Auth=EUBBIacAAADK-kNxvRVmcQghpt3cqSMfEooLNMflLNIQqwgP9OrZS83gs-KSdTNeXhxsET7FYePWmaD8Vsy1V4LSUGMUP48Je2TO8OcjBj6HgAtPhiZeX-gKDfagZDK44j4n-Tkb44nhOnp2_QPSnBj3Z2vYwOEDjjG3Q53aQVC2132JKOuGh

Consulte a documentação do ClientLogin para ver informações específicas sobre os parâmetros usados na solicitação acima. Neste exemplo, o serviço que estamos usando é a API de dados dos Álbuns da web do Picasa. O nome do serviço (service) é lh2. Os nomes dos outros serviços de dados do Google podem ser encontrados na página Perguntas frequentes sobre as APIs de dados do Google.

O token Auth na resposta acima é o único necessário para a autenticação nos serviços de dados do Google. O valor desse token é formado em um cabeçalho HTTP, que é usado em cada solicitação para um serviço de dados do Google.

curl --silent --header "Authorization: GoogleLogin auth=EUBBIacAAADK\
-kNxvRVmcQghpt3cqSMfEooLNMflLNIQqwgP9OrZS83gs-KSdTNeXhxs\
ET7FYePWmaD8Vsy1V4LSUGMUP48Je2TO8OcjBj6HgAtPhiZeX-gKDfag\
ZDK44j4n-Tkb44nhOnp2_QPSnBj3Z2vYwOEDjjG3Q53aQVC2132JKOuGh" \
"http://picasaweb.google.com/data/feed/api/user/default"

Observação: o método de escape de caracteres de nova linha com caracteres de barra invertida ('\") acima não funciona no shell do comando Windows. Por isso, digite o comando inteiro em uma linha se estiver executando curl no Windows.


Como recuperar feeds e entradas

Nas APIs de dados do Google, a recuperação de feeds e entradas é feita com um GET HTTP em um URL, com um conjunto opcional de parâmetros de consulta. Como estamos fazendo uma solicitação GET, apenas o cabeçalho de autenticação e o URL precisam ser transmitidos para curl. O exemplo abaixo continuará usando a API de dados dos Álbuns da web do Picasa e será usada para recuperar uma lista de álbuns de propriedade do usuário autenticado. Neste exemplo, encurtamos o token de autenticação para ABCDEFG, mas o token completo (por exemplo, EUBBIacA...32JKOuGh acima) precisa ser usado no lugar dele.

curl --silent --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/feed/api/user/default"

Isso retornará um blob não formatado de XML:

<?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:geo='http://www.w3.org/2003/01/geo/wgs84_pos#' xmlns:gml='http://www.opengis.net/gml' xmlns:georss='http://www.georss.org/georss' xmlns:photo='http://www.pheed.com/pheed/' xmlns:media='http://search.yahoo.com/mrss/' xmlns:batch='http://schemas.google.com/gdata/batch' xmlns:gphoto='http://schemas.google.com/photos/2007'><id>http://picasaweb.google.com/data/feed/base/user/brad.gushue</id><updated>2007-09-13T21:30:21.454Z</updated>...</entry></feed>

Existem algumas ferramentas decentes para formatar essa saída de modo a torná-la mais legível, incluindo tidy. A maneira mais fácil de usar o tidy é canalizar a saída do comando curl para arrumar como este:

curl --silent --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/feed/api/user/default" | tidy -xml -indent -quiet

Isso resulta em um feed muito mais legível, como o seguinte:

<?xml version='1.0' encoding='utf-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' 
xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' 
xmlns:geo='http://www.w3.org/2003/01/geo/wgs84_pos#' 
xmlns:gml='http://www.opengis.net/gml' 
xmlns:georss='http://www.georss.org/georss' 
xmlns:photo='http://www.pheed.com/pheed/' 
xmlns:media='http://search.yahoo.com/mrss/' 
xmlns:batch='http://schemas.google.com/gdata/batch' 
xmlns:gphoto='http://schemas.google.com/photos/2007'>
  <id>http://picasaweb.google.com/data/feed/api/user/brad.gushue</id>
  <updated>2007-09-13T21:47:07.337Z</updated>
  <category scheme='http://schemas.google.com/g/2005#kind'
  term='http://schemas.google.com/photos/2007#user' />
  <title type='text'>brad.gushue</title>
  <subtitle type='text'></subtitle>
  <icon>
  http://lh6.google.com/brad.gushue/AAAAj9zigp4/AAAAAAAAAAA/RiMAlXV4MFI/s64-c/brad.gushue</icon>
  <link rel='http://schemas.google.com/g/2005#feed'
  type='application/atom+xml'
  href='http://picasaweb.google.com/data/feed/api/user/brad.gushue' />
  <link rel='alternate' type='text/html'
  href='http://picasaweb.google.com/brad.gushue' />
  <link rel='self' type='application/atom+xml'
  href='http://picasaweb.google.com/data/feed/api/user/brad.gushue?start-index=1&max-results=1000' />
  <author>
    <name>Brad</name>
    <uri>http://picasaweb.google.com/brad.gushue</uri>
  </author>
  <generator version='1.00' uri='http://picasaweb.google.com/'>
  Picasaweb</generator>
  <openSearch:totalResults>8</openSearch:totalResults>
  <openSearch:startIndex>1</openSearch:startIndex>
  <openSearch:itemsPerPage>1000</openSearch:itemsPerPage>
  <gphoto:user>brad.gushue</gphoto:user>
  <gphoto:nickname>Brad</gphoto:nickname>
  <gphoto:thumbnail>
  http://lh6.google.com/brad.gushue/AAAAj9zigp4/AAAAAAAAAAA/RiMAlXV4MFI/s64-c/brad.gushue</gphoto:thumbnail>
  <entry>
    <id>
    http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593</id>
    <published>2007-05-23T04:55:52.000Z</published>
    <updated>2007-05-23T04:55:52.000Z</updated>
    <category scheme='http://schemas.google.com/g/2005#kind'
    term='http://schemas.google.com/photos/2007#album' />
    <title type='text'>Trip To Italy</title>
    <summary type='text'>This was the recent trip I took to
    Italy.</summary>
    <rights type='text'>public</rights>
    <link rel='http://schemas.google.com/g/2005#feed'
    type='application/atom+xml'
    href='http://picasaweb.google.com/data/feed/api/user/brad.gushue/albumid/9810315389720904593' />
    <link rel='alternate' type='text/html'
    href='http://picasaweb.google.com/brad.gushue/TripToItalyV2' />
    <link rel='self' type='application/atom+xml'
    href='http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593' />
    <link rel='edit' type='application/atom+xml'
    href='http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593/123456' />
    <author>
      <name>Brad</name>
      <uri>http://picasaweb.google.com/brad.gushue</uri>
    </author>
    <gphoto:id>9810315389720904593</gphoto:id>
    <media:group>
    ...
    </media:group>
  </entry>
  <entry>
  ...
  </entry>

</feed>

As entradas individuais podem ser recuperadas da mesma forma fornecendo o URL da entrada, em vez do URL do feed.

Atualizando entradas

As entradas nas APIs de dados do Google são atualizadas com uma HTTP PUT para o URL de edição com uma nova cópia do XML da entrada no corpo da solicitação.

  1. Recuperar a entrada usando o valor de URL atom:link/@rel='self'.
  2. Atualizar a entrada localmente para fazer as mudanças necessárias
  3. PUT a entrada de volta para o servidor, usando o valor de URL atom:link/@rel='edit'.

1. Como recuperar a entrada

A entrada pode ser recuperada usando um dos dois URLs em negrito no bloco de feed acima. O URL necessário é o valor href do elemento link com um rel='self'.

curl --silent --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593"

2. Como atualizar a entrada localmente

Depois de recuperar a entrada, ela vai precisar ser atualizada usando um editor de texto ou aplicativo local para fazer as mudanças necessárias. No comando acima, para recuperar uma entrada, não canalizamos os resultados para tidy, como fizemos nos exemplos anteriores. O resultado é um XML que representa os mesmos dados, mas tem uma formatação diferente da versão transmitida para tidy. Para editar manualmente uma entrada, usar tidy pode facilitar o trabalho com o XML.

Observação: lembre-se de incluir todas as definições de namespace XML que são usadas como atributos para o atom:entry ao publicar sua nova entrada. A omissão delas causa exceções de análise. Além disso, tidy substituirá os espaços entre as definições de namespace por caracteres de nova linha. Embora esse XML seja válido, os serviços de dados do Google não o aceitam no momento. Se você usar tidy, adicione espaços entre esses atributos no elemento entry.

3. Como atualizar a entrada no servidor

Usando o URL edit, você precisa PUT uma cópia da entrada para o serviço usando cURL. Um cabeçalho para indicar o tipo de conteúdo que está sendo enviado ao servidor precisa ser adicionado. O snippet a seguir pressupõe que o arquivo com a entrada atualizada é salvo em updated_input.xml.

curl --silent --data-binary "@updated_entry.xml" --request PUT --header "Content-Type: application/atom+xml" --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593/123456"

Criando entradas

As entradas nas APIs de dados do Google são criadas com uma HTTP POST para o URL de postagem com uma nova entrada. O atom:id é atribuído pelo servidor e, portanto, não é necessário incluir novas entradas. A maneira mais fácil de criar uma nova entrada é usar uma entrada antiga e modificá-la. O exemplo a seguir faz isso.

  1. Recuperar uma entrada de modelo usando a função atom:link/@rel='self'.
  2. Modifique a entrada do modelo localmente para remover informações desnecessárias e fazer as mudanças necessárias.
  3. POST a entrada de volta para o servidor, usando o URL post para o feed. Isso pode ser encontrado no feed recuperado como o valor href do elemento link com um rel='http://schemas.google.com/g/2005#post' ou na documentação do serviço em http://code.google.com.

1. Recuperar uma entrada de modelo

Uma única entrada pode ser recuperada usando o valor href de um elemento link com um rel='self' da mesma forma que uma entrada foi recuperada antes de atualizá-la no exemplo acima.

curl --silent --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593" | tidy -xml -indent -quiet > template_entry.xml

Depois de usar tidy, a resposta será parecida com esta:

<entry xmlns='http://www.w3.org/2005/Atom' 
xmlns:exif='http://schemas.google.com/photos/exif/2007'
xmlns:geo='http://www.w3.org/2003/01/geo/wgs84_pos#'
xmlns:gml='http://www.opengis.net/gml'
xmlns:georss='http://www.georss.org/georss'
xmlns:photo='http://www.pheed.com/pheed/'
xmlns:media='http://search.yahoo.com/mrss/'
xmlns:batch='http://schemas.google.com/gdata/batch'
xmlns:gphoto='http://schemas.google.com/photos/2007'>
  <id>
  http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389741123981</id>
  <published>2007-05-23T04:55:52.000Z</published>
  <updated>2007-05-23T04:55:52.000Z</updated>
  <category scheme='http://schemas.google.com/g/2005#kind'
  term='http://schemas.google.com/photos/2007#album' />
  <title type='text'>Trip To Italy</title>
  <summary type='text'>This was the recent trip I took to
  Italy.</summary>
  <rights type='text'>public</rights>
  <link rel='http://schemas.google.com/g/2005#feed'
  type='application/atom+xml'
  href='http://picasaweb.google.com/data/feed/api/user/brad.gushue/albumid/9810315389741123981' />
  <link rel='alternate' type='text/html'
  href='http://picasaweb.google.com/brad.gushue/TripToItaly' />
  <link rel='self' type='application/atom+xml'
  href='http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389741123981' />
  <link rel='edit' type='application/atom+xml'
  href='http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389741123981/1179896152905401' />
  <author>
    <name>Brad</name>
    <uri>http://picasaweb.google.com/brad.gushue</uri>
  </author>
  <gphoto:id>9810315389741123981</gphoto:id>
  <gphoto:name>TripToItaly</gphoto:name>
  <gphoto:location></gphoto:location>
  <gphoto:access>public</gphoto:access>
  <gphoto:timestamp>1179896152000</gphoto:timestamp>
  <gphoto:numphotos>0</gphoto:numphotos>
  <gphoto:numphotosremaining>500</gphoto:numphotosremaining>
  <gphoto:bytesUsed>0</gphoto:bytesUsed>
  <gphoto:user>brad.gushue</gphoto:user>
  <gphoto:nickname>Brad</gphoto:nickname>
  <gphoto:commentingEnabled>true</gphoto:commentingEnabled>
  <gphoto:commentCount>0</gphoto:commentCount>
  <media:group>
    <media:title type='plain'>Trip To Italy</media:title>
    <media:description type='plain'>This was the recent trip I took
    to Italy.</media:description>
    <media:keywords></media:keywords>
    <media:content url='http://lh5.google.com/brad.gushue/ADFUFKqeA5E/AAAAAAAAABc/V6Sga_Z03WU/TripToItaly.jpg'
    type='image/jpeg' medium='image' />
    <media:thumbnail url='http://lh5.google.com/brad.gushue/ADFUFKqeA5E/AAAAAAAAABc/V6Sga_Z03WU/s160-c/TripToItaly.jpg'
    height='160' width='160' />
    <media:credit>Brad</media:credit>
  </media:group>

</entry>

2. Modificar a entrada do modelo

Queremos criar um álbum chamado "Curling in Canada" com fotos da nossa recente partida de curling. Os dados do Google permitem que você descarte elementos do Atom para os quais o servidor fornece valores. Por isso, para criar essa entrada de modelo simples, removeremos a atom:id, atom:published, atom:updated, atom:author e os vários elementos atom:link do feed. Isso nos dá uma entrada de modelo reduzida. A entrada precisa ser modificada para representar o novo álbum que estamos criando:

<entry xmlns='http://www.w3.org/2005/Atom' 
xmlns:gphoto='http://schemas.google.com/photos/2007'>
  <category scheme='http://schemas.google.com/g/2005#kind'
  term='http://schemas.google.com/photos/2007#album' />
  <title type='text'>Curling in Canada</title>
  <summary type='text'>Pictures of all my curling matches in Canada.</summary>
  <gphoto:location>Canada</gphoto:location>
  <gphoto:access>public</gphoto:access>
  <gphoto:commentingEnabled>true</gphoto:commentingEnabled>

</entry>

Observação: lembre-se de incluir todas as definições de namespace XML que são usadas como atributos para o atom:entry ao publicar sua nova entrada. A omissão delas causa exceções de análise. Além disso, tidy substituirá os espaços entre as definições de namespace e caracteres de nova linha. Embora esse XML seja válido, os serviços de dados do Google não o aceitam no momento. Se você usar tidy, adicione espaços entre esses atributos no elemento entry.

3. Como publicar a nova entrada no servidor

O comando curl para postar uma nova entrada no servidor é muito semelhante a atualizar uma entrada atual, exceto que o URL é diferente:

curl --silent --request POST --data-binary "@template_entry.xml" --header "Content-Type: application/atom+xml" --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/feed/api/user/brad.gushue" | tidy -xml -indent -quiet

Se a publicação for bem-sucedida, a saída XML resultante será uma cópia da entrada recém-criada. Essa entrada incluirá itens gerados pelo servidor no momento da criação da entrada, incluindo os valores dos elementos atom:id, atom:published, atom:updated e atom:link. Os valores link resultantes podem ser usados para editar ou excluir a entrada, desde que nenhuma alteração adicional seja feita temporariamente.

Excluindo entradas

A exclusão de entradas é muito semelhante à atualização de entradas, com a exceção de que um método HTTP DELETE é usado em vez de um HTTP PUT, e nenhum dado é necessário para enviar. Assim como a solicitação de atualização, o URL edit é usado como destino da solicitação HTTP.

curl --silent --request DELETE --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593/123456"

Como fazer upload de objetos de mídia

Um recurso importante da API de dados dos Álbuns da web do Picasa e da API de dados da Lista de documentos é a capacidade de carregar objetos binários. O cURL pode facilmente fazer upload de dados binários e um cabeçalho slug. No entanto, a API de dados da lista de documentos atualmente exige a postagem do XML junto com os dados binários como uma mensagem MIME multiparte. A criação da mensagem de várias partes está fora do escopo deste artigo.

O exemplo abaixo mostra como fazer upload de uma imagem chamada sweeping_the_rock.png em um Álbum da Web do Picasa com o título "Sweepping rock":

curl --silent --request POST --data-binary "@sweeping_the_rock.png" --header "Slug: Sweeping the rock" --header "Content-Type: image/png" --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/feed/api/user/brad.gushue/albumid/5113621341847124417" | tidy -xml -indent -quiet

Outras ferramentas de linha de comando

Alguns desenvolvedores preferem aprender ou depurar usando outras ferramentas de linha de comando.

As ferramentas mais usadas são:

  • telnet, openssl são usados para fazer conexões de soquete brutas (texto simples e baseados em SSL, respectivamente) com servidores da Web e podem ser usados para interagir com os serviços de dados do Google. Nem todos os serviços de dados do Google são compatíveis com SSL. Veja como abrir as conexões:
    • telnet picasaweb.google.com 80 (API de dados dos Álbuns do Picasa)
    • openssl s_client -connect www.google.com:443 (API de dados do Google Agenda e outros serviços em www.google.com)
    Depois que a conexão for estabelecida, será necessário enviar uma solicitação HTTP bruta. Essa solicitação inclui o verbo HTTP, o caminho relativo, a versão, todos os cabeçalhos e o corpo da solicitação. Veja um exemplo:
    POST /data/feed/api/user/brad.gushue HTTP/1.1
    Host: picasaweb.google.com
    Authorization: GoogleLogin auth=ABCDEFG
    Content-Length: 493
    
    <entry xmlns='http://www.w3.org/2005/Atom' 
    xmlns:gphoto='http://schemas.google.com/photos/2007'>
      <category scheme='http://schemas.google.com/g/2005#kind'
      term='http://schemas.google.com/photos/2007#album' />
      <title type='text'>Curling in Canada</title>
      <summary type='text'>Pictures of all my curling matches in Canada.</summary>
      <gphoto:location>Canada</gphoto:location>
      <gphoto:access>public</gphoto:access>
      <gphoto:commentingEnabled>true</gphoto:commentingEnabled>
    
    </entry>
    
    Ao enviar dados HTTP brutos, lembre-se de que as operações POST e PUT exigirão calcular o valor de um cabeçalho Content-Length. Use a ferramenta UNIX wc para calcular esse valor. Coloque todo o conteúdo do corpo HTTP em um arquivo de texto como template_entry.xml (exemplo usado acima) e execute wc -c template_entry.xml. Muitas vezes, é difícil depurar se você usar acidentalmente um valor incorreto para o cabeçalho Content-Length.
  • O wget normalmente é usado para fazer o download de dados de um servidor da Web para um arquivo local. No entanto, o wget tem muitas opções que possibilitam executar todos os diferentes tipos de solicitações necessários para interagir com os serviços de dados do Google. Veja um exemplo de como usar wget para POST uma nova entrada de álbum nos Álbuns do Picasa:
    wget --post-file template_entry.xml --header "Authorization: GoogleLogin auth=ABCDEFG" --header "Content-Type: application/atom+xml" "http://picasaweb.google.com/data/feed/api/user/brad.gushue"
    
  • O xlsxtproc é uma ferramenta para aplicar transformações XSL (XSLT) em documentos XML. Ele pode ser usado para extrair facilmente os dados desejados de uma entrada ou feed XML retornado pelas APIs de dados do Google ou para gerar entradas novas ou atualizadas.

Conclusão

Como você viu, o cURL e várias outras ferramentas de linha de comando podem ser usadas para interagir facilmente com os serviços de dados do Google usando XML e HTTP brutos. Junte-se a nós nos fóruns específicos da API se tiver dúvidas sobre como usar essas ferramentas com sua API de dados do Google favorita.