cURL을 사용하여 Google 데이터 서비스와 상호작용

경고: 이 페이지는 Google의 이전 API인 Google Data API에 관한 내용이며, Google Data API 디렉터리에 나열된 API에만 해당합니다. 이 API 중 상당수는 최신 API로 대체되었습니다. 특정 새 API에 관한 자세한 내용은 새 API의 문서를 참고하세요. 최신 API로 요청을 승인하는 방법에 대한 자세한 내용은 Google 계정 인증 및 승인을 참고하세요.

Ryan Boyd, Google Data API팀
2007년 9월

소개

Google Data API는 기본적으로 Atom 피드와 항목 (XML)을 데이터 형식으로 사용하고 HTTP를 데이터 전송 프로토콜로 사용하여 Atom 게시 프로토콜을 확장합니다. Google에서는 Google Data API와의 상호작용을 더 쉽게 할 수 있도록 여러 클라이언트 라이브러리를 게시합니다. 하지만 언제든지 하위 수준 도구를 사용하여 Google 서비스를 이용할 수 있으며, 약간의 안내만 있으면 쉽게 할 수 있습니다.

cURL은 HTTP를 비롯한 다양한 프로토콜을 사용하여 요청을 실행하는 명령줄 애플리케이션입니다. cURL은 하위 수준에서 API와 상호작용하는 데 필요한 HTTP 기능을 지원하므로 개발자가 Google 데이터 서비스를 테스트하는 데 자주 사용됩니다.

cURL은 HTTP 통신 실행만 지원하므로 애플리케이션을 사용하려면 Google 데이터 프로토콜, 사용되는 서비스별 프로토콜 및 XML 데이터 형식에 대한 지식이 필요합니다. 이 도움말에는 이러한 작업을 더 쉽게 할 수 있는 다른 도구도 언급되어 있습니다.

이 도움말에서는 Picasa Web Albums Data API를 기반으로 한 예를 사용합니다. 하지만 이러한 모든 예는 다른 Google Data API에 쉽게 적용할 수 있습니다.

cURL 획득 및 설치

cURL은 많은 UNIX/Linux 플랫폼의 기본 설치에서 일반적으로 사용할 수 있습니다. 선호하는 셸에 curl을 입력하여 도구가 설치되어 있고 PATH에 있는지 확인합니다. 도구가 설치되어 있지 않은 경우 cURL 웹사이트다운로드 페이지를 방문하여 공식 소스 또는 사용자 제공 바이너리 패키지를 받으세요. 명령줄 도구는 libcurl 라이브러리를 사용하며, 이 라이브러리는 별도의 다운로드 패키지로 제공될 수 있습니다. 따라서 소스에서 컴파일하지 않는 경우 'libcurl' 패키지 대신 '바이너리' 패키지를 다운로드해야 합니다. cURL을 사용하여 인증 토큰을 획득하거나 요청에 SSL을 사용해야 하는 일부 Google 데이터 서비스에 액세스하려면 SSL 지원 패키지가 필요합니다.

Google 데이터 서비스에 인증

인증된 Google 데이터 요청은 ClientLogin (데스크톱/모바일 앱) 또는 AuthSub (웹 앱) 인증 토큰이 포함된 HTTP 헤더를 요청에 추가하여 실행됩니다. cURL을 사용한 테스트를 위해 ClientLogin이 더 쉬운 방법이며 아래에 설명되어 있습니다. AuthSub 인증 헤더는 cURL과 함께 사용할 수 있지만 토큰을 획득하는 고급 절차는 이 도움말의 범위를 벗어납니다.

ClientLogin 사용

ClientLogin은 설치된 (데스크톱/모바일) 애플리케이션을 위한 것입니다. 이 인증 방법을 사용하면 Google Data API를 사용하는 애플리케이션이 사용자의 사용자 이름과 비밀번호를 직접 처리합니다.

ClientLogin의 인증 요청은 사용자 이름, 비밀번호, 서비스 이름을 양식 게시 변수로 사용합니다. 이러한 변수는 각각 Email, Passwd, service 인수로 전달됩니다. 이 요청은 여러 토큰이 포함된 응답을 생성하며, 그중 하나를 사용하여 Google 데이터 서비스에 요청할 수 있습니다. curl로 전달되는 데이터 인수는 비 ASCII 문자가 포함된 경우 URL 인코딩되어야 합니다. 비 ASCII 문자는 EmailPasswd 인수에서 자주 나타납니다. --data-urlencode 플래그를 사용하여 curl에 이러한 인수를 URL 인코딩하도록 요청할 수 있습니다.

요청 예시:

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

응답 예:

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

위 요청에 사용된 매개변수에 관한 자세한 내용은 ClientLogin 문서를 참고하세요. 이 예에서는 Picasa Web Albums Data API를 사용합니다. 서비스 이름 (service)은 lh2입니다. 다른 Google 데이터 서비스의 서비스 이름은 Google 데이터 API FAQ 페이지에서 확인할 수 있습니다.

위 응답의 Auth 토큰 값은 Google 데이터 서비스에 대한 인증에 필요한 유일한 값입니다. 이 토큰의 값은 HTTP 헤더로 형성되며, 이 헤더는 Google 데이터 서비스에 대한 각 요청에 사용됩니다.

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

참고: 위의 백슬래시 문자 ('\')를 사용하여 줄바꿈 문자를 이스케이프하는 방법은 Windows 명령 셸에서 작동하지 않으므로 Windows에서 curl을 실행하는 경우 한 줄에 전체 명령어를 입력해야 합니다.


피드 및 항목 가져오기

Google Data API에서 피드와 항목을 가져오는 작업은 선택적 쿼리 매개변수 집합과 함께 URL에 대해 HTTP GET를 실행하여 이루어집니다. GET 요청을 실행하므로 인증 헤더와 URL만 curl에 전달하면 됩니다. 아래 예에서는 Picasa Web Albums Data API를 계속 사용하며 인증된 사용자가 소유한 앨범 목록을 검색하는 데 사용됩니다. 이 예에서는 인증 토큰을 ABCDEFG로 단축했지만 실제로는 전체 토큰 (예: 위의 EUBBIacA...32JKOuGh)을 사용해야 합니다.

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

그러면 형식이 지정되지 않은 XML blob이 반환됩니다.

<?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>

이 출력을 사람이 읽기 쉽도록 포맷하는 데 사용할 수 있는 적절한 도구가 몇 가지 있습니다(예: tidy). tidy를 사용하는 가장 쉬운 방법은 curl 명령어의 출력을 다음과 같이 tidy로 파이프하는 것입니다.

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

이렇게 하면 다음과 같이 훨씬 더 읽기 쉬운 피드가 표시됩니다.

<?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>

피드 URL이 아닌 항목의 URL을 제공하여 동일한 방식으로 개별 항목을 가져올 수 있습니다.

항목 업데이트

Google Data API의 항목은 요청 본문에 항목의 XML 새 복사본을 포함하여 수정 URL에 HTTP PUT를 실행하여 업데이트됩니다.

  1. atom:link/@rel='self' URL 값을 사용하여 항목 가져오기
  2. 필요한 변경사항을 적용하기 위해 항목을 로컬로 업데이트합니다.
  3. atom:link/@rel='edit' URL 값을 사용하여 항목을 서버로 다시 PUT합니다.

1. 항목 가져오기

항목은 위의 피드 블록에서 굵게 표시된 두 URL 중 하나를 사용하여 가져올 수 있습니다. 필요한 URL은 rel='self'이 있는 link 요소의 href 값입니다.

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

2. 항목을 로컬로 업데이트

항목을 가져온 후 로컬 텍스트 편집기나 애플리케이션을 사용하여 항목을 업데이트하여 필요한 변경사항을 항목에 적용해야 합니다. 항목을 가져오는 위의 명령어에서는 이전 예와 달리 결과를 tidy로 파이프하지 않았습니다. 결과는 동일한 데이터를 나타내지만 tidy에 파이프된 버전과 형식이 다른 XML입니다. 항목을 직접 수정할 때는 tidy을 사용하면 XML 작업을 더 쉽게 할 수 있습니다.

참고: 새 항목을 게시할 때 atom:entry의 속성으로 사용되는 모든 XML 네임스페이스 정의를 포함해야 합니다. 이를 누락하면 파싱 예외가 발생합니다. 또한 tidy은 네임스페이스 정의 사이의 공백을 줄바꿈 문자로 바꿉니다. 이는 유효한 XML이지만 현재 Google 데이터 서비스에서는 허용하지 않습니다. tidy를 사용하는 경우 entry 요소의 이러한 속성 사이에 공백을 추가해야 합니다.

3. 서버에서 항목 업데이트

edit URL을 사용하여 cURL을 통해 서비스에 항목의 사본을 PUT해야 합니다. 서버로 전송되는 콘텐츠의 유형을 나타내는 헤더를 추가해야 합니다. 다음 스니펫에서는 업데이트된 항목이 포함된 파일이 updated_entry.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"

항목 만들기

Google Data API의 항목은 새 항목으로 게시 URL에 HTTP POST를 실행하여 생성됩니다. atom:id는 서버에서 할당하므로 새 항목에 포함할 필요가 없습니다. 새 항목을 만드는 가장 쉬운 방법은 이전 항목을 가져와 수정하는 것입니다. 다음 예시가 바로 그 역할을 합니다.

  1. atom:link/@rel='self'를 사용하여 템플릿 항목 가져오기
  2. 템플릿 항목을 로컬로 수정하여 불필요한 정보를 삭제하고 필요한 변경사항을 적용합니다.
  3. POST 피드의 post URL을 사용하여 항목을 서버로 다시 전송합니다. 이 값은 가져온 피드에서 rel='http://schemas.google.com/g/2005#post'이 있는 link 요소의 href 값으로 찾거나 http://code.google.com의 서비스 문서에서 찾을 수 있습니다.

1. 템플릿 항목 가져오기

단일 항목은 위의 예에서 업데이트하기 전에 항목을 가져온 것과 같은 방식으로 rel='self'이 있는 link 요소의 href 값을 사용하여 가져올 수 있습니다.

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

tidy를 사용한 후의 응답은 다음과 같습니다.

<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. 템플릿 항목 수정

최근 컬링 경기 사진으로 '캐나다 컬링'이라는 앨범을 만들고 싶습니다. Google Data에서는 서버가 값을 제공하는 Atom 요소를 삭제할 수 있으므로 이 간단한 템플릿 항목을 만들려면 피드에서 atom:id, atom:published, atom:updated, atom:author 및 다양한 atom:link 요소를 삭제합니다. 이렇게 하면 간소화된 템플릿 항목이 제공됩니다. 그런 다음 항목을 수정하여 새로 만들 앨범을 나타내야 합니다.

<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>

참고: 새 항목을 게시할 때 atom:entry의 속성으로 사용되는 모든 XML 네임스페이스 정의를 포함해야 합니다. 이를 누락하면 파싱 예외가 발생합니다. 또한 tidy는 네임스페이스 정의 사이의 공백을 줄바꿈 문자로 바꿉니다. 이는 유효한 XML이지만 현재 Google 데이터 서비스에서는 허용하지 않습니다. tidy를 사용하는 경우 entry 요소의 이러한 속성 사이에 공백을 추가해야 합니다.

3. 새 항목을 서버에 게시

서버에 새 항목을 게시하는 curl 명령어는 URL이 다르다는 점을 제외하고 기존 항목을 업데이트하는 것과 매우 유사합니다.

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

게시가 성공하면 결과 XML 출력은 새로 생성된 항목의 사본입니다. 이 항목에는 항목이 생성될 때 서버에서 생성한 항목이 포함되며, 여기에는 atom:id, atom:published, atom:updated, atom:link 요소의 값이 포함됩니다. 결과 link 값을 사용하여 항목을 수정하거나 삭제할 수 있습니다. 단, 그동안 추가 변경사항이 없어야 합니다.

항목 삭제

항목 삭제는 항목 업데이트와 매우 유사하지만 HTTP PUT 대신 HTTP DELETE 메서드가 사용되고 전송해야 하는 데이터가 없습니다. 업데이트 요청과 마찬가지로 edit URL이 HTTP 요청의 타겟으로 사용됩니다.

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

미디어 객체 업로드

Picasa Web Albums Data API와 Documents List Data API의 중요한 기능은 바이너리 객체를 업로드할 수 있다는 것입니다. cURL을 사용하면 바이너리 데이터와 슬러그 헤더를 쉽게 업로드할 수 있습니다. 하지만 현재 Documents List 데이터 API에서는 XML을 바이너리 데이터와 함께 MIME 멀티파트 메시지로 게시해야 합니다. 멀티파트 메시지 구성은 이 문서의 범위를 벗어납니다.

아래 예는 sweeping_the_rock.png라는 사진을 제목이 'Sweeping the rock'인 Picasa 웹 앨범에 업로드하는 방법을 보여줍니다.

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

기타 명령줄 도구

일부 개발자는 다른 명령줄 도구를 사용하여 학습하거나 디버깅하는 것을 선호합니다.

많이 사용되는 도구는 다음과 같습니다.

  • telnet, openssl은 웹 서버에 원시 소켓 연결 (각각 일반 텍스트 및 ssl 기반)을 만드는 데 사용되며 Google 데이터 서비스와 상호작용하는 데 사용할 수 있습니다. 일부 Google 데이터 서비스는 SSL을 지원하지 않을 수 있습니다. 연결을 여는 방법은 다음과 같습니다.
    • telnet picasaweb.google.com 80 (Picasa 웹앨범 데이터 API)
    • openssl s_client -connect www.google.com:443 (Google Calendar 데이터 API 및 www.google.com의 기타 서비스)
    연결이 설정된 후에는 원시 HTTP 요청을 전송해야 합니다. 이 요청에는 HTTP 동사, 상대 경로, 버전, 모든 헤더, 요청 본문이 포함됩니다. 예를 들면 다음과 같습니다.
    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>
    
    원시 HTTP 데이터를 전송할 때 POSTPUT 작업에는 Content-Length 헤더의 값을 계산해야 합니다. UNIX 도구 wc를 사용하여 이 값을 계산할 수 있습니다. HTTP 본문의 모든 콘텐츠를 template_entry.xml (위에서 사용한 예)와 같은 텍스트 파일에 배치하고 wc -c template_entry.xml을 실행합니다. Content-Length 헤더에 잘못된 값을 실수로 사용하면 디버그하기가 어려운 경우가 많습니다.
  • wget은 일반적으로 웹 서버에서 로컬 파일로 데이터를 다운로드하는 데 사용됩니다. 하지만 wget에는 Google 데이터 서비스와 상호작용하는 데 필요한 모든 유형의 요청을 수행할 수 있는 다양한 옵션이 있습니다. 다음은 wget를 사용하여 새 앨범 항목을 Picasa 웹앨범에 POST하는 방법의 예입니다.
    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"
    
  • xsltproc은 XML 문서에 XSL 변환 (XSLT)을 적용하는 도구입니다. Google Data API에서 반환된 XML 항목이나 피드에서 원하는 데이터를 쉽게 추출하거나 새 항목이나 업데이트된 항목을 생성하는 데 사용할 수 있습니다.

결론

보셨듯이 cURL 및 기타 여러 명령줄 도구를 사용하면 원시 XML과 HTTP를 사용하여 Google 데이터 서비스와 쉽게 상호작용할 수 있습니다. 좋아하는 Google Data API와 함께 이러한 도구를 사용하는 데 궁금한 점이 있으면 API 관련 포럼에 참여하세요.