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

경고: 이 페이지는 Google의 이전 API인 Google Data API에 관한 것으로, Google Data API 디렉터리에 표시된 API 중 상당수가 최신 API로 대체된 API입니다. 특정 새 API에 대한 자세한 내용은 새 API 문서를 참조하세요. 최신 API를 사용하여 요청을 승인하는 방법은 Google 계정 인증 및 승인을 참고하세요.

Ryan Boyd, Google 데이터 API팀
2007년 9월

소개

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

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

cURL은 HTTP 통신만 지원합니다. 따라서 Google 데이터 프로토콜, 서비스별 프로토콜, 사용되는 XML 데이터 형식에 대한 지식은 애플리케이션 작업을 위한 전제 조건입니다. 이러한 작업을 더 쉽게 할 수 있도록 이 도움말에서 다른 도구를 언급합니다.

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

cURL 가져오기 및 설치

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

Google 데이터 서비스에 대한 인증

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

ClientLogin 사용

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

ClientLogin에 대한 인증 요청은 사용자 이름, 비밀번호, 서비스 이름을 양식 게시물 변수로 사용합니다. 이러한 변수는 각각 Email, Passwd, service 인수로 전달됩니다. 이 요청을 실행하면 여러 토큰이 포함된 응답이 생성되며, 그 중 하나를 사용하여 Google 데이터 서비스에 요청할 수 있습니다. curl과 함께 전달되는 데이터 인수는 종종 EmailPasswd 인수에 표시되는 비ASCII 문자를 포함하는 경우 URL 인코딩되어야 합니다. --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 웹앨범 데이터 API입니다. 서비스 이름 (service)은 lh2입니다. 다른 Google 데이터 서비스의 서비스 이름은 Google Data 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 데이터 API에서는 URL에 HTTP GET를 수행하여 피드와 항목을 검색하고 선택적 쿼리 매개변수 집합을 함께 사용합니다. GET 요청을 실행하므로 인증 헤더와 URL만 curl에 전달하면 됩니다. 아래 예는 Picasa 웹앨범 데이터 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 등 이 출력의 형식을 사람이 쉽게 읽을 수 있도록 지정하는 데 적합한 도구가 있습니다. 정리를 사용하는 가장 쉬운 방법은 curl 명령어의 출력을 다음과 같이 정리하는 것입니다.

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이 아닌 항목의 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 URL을 사용하여 서버에 항목을 다시 POST합니다. 가져온 피드에서 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 데이터를 사용하면 서버에서 값을 제공하는 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 웹앨범 데이터 API 및 문서 목록 데이터 API의 주요 기능은 바이너리 객체 업로드 기능입니다. cURL은 바이너리 데이터 및 슬러그 헤더를 쉽게 업로드할 수 있습니다. 하지만 Documents List Data API는 현재 XML을 바이너리 데이터와 함께 MIME 멀티파트 메시지로 게시해야 합니다. 멀티파트 메시지 양식은 이 도움말의 범위를 벗어납니다.

아래 예는 '바위 쓸기'라는 제목으로 Picasa에 sweeping_the_rock.png 사진을 업로드하는 방법을 보여줍니다.

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 (www.google.com의 Google Calendar Data API 및 기타 서비스)
    연결이 완료되면 원시 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 데이터 API에서 반환하는 XML 항목 또는 피드에서 원하는 데이터를 쉽게 추출하거나 새 항목 또는 업데이트된 항목을 생성하는 데 사용할 수 있습니다.

마무리

보시다시피 cURL 및 기타 여러 명령줄 도구를 사용하여 원시 XML 및 HTTP를 통해 Google 데이터 서비스와 쉽게 상호작용할 수 있습니다. 이 도구를 즐겨 사용하는 Google 데이터 API와 함께 사용하는 방법에 관해 궁금한 점이 있다면 API 전용 포럼에 참여해 보세요.