9.6 KiB
title | author | date | wordtwit_post_info | categories | |||
---|---|---|---|---|---|---|---|
gauche でウェブAPIをたたく — その1 | kazu634 | 2010-02-14 |
|
|
Lispを使ってウェブAPIをたたき、xmlを取得しました。http getメソッドを使う tumblr の記事を取得します。
httpリクエストを送る
http-getを用います:
ここでpathはリクエストURIのパスコンポーネントまでを指定する 文字列です。与えられたnameとvalueのalistから、 httpリクエスト手続きはHTML4で定められた application/x-www-form-urlencoded形式の クエリ文字列を構成し、pathにアペンドします。 例えば次のふたつのリクエストは同じ効果を持ちます。 二番目の呼び出しではurlエスケープが自動的に行われることに注目してください。
(http-get "example.com" "/search?q=foo%20bar&n=20") (http-get "example.com" '("/search" (q "foo bar") (n 20)))
getメソッドだとこれで十分です。postメソッドだとこれ以外にも指定するみたいです(そもそも、 http-post メソッドを使用する必要がある)。
http-getメソッドは、
- httpステータスコード
- httpレスポンスヘッダー
- httpボディー
の三つを返します(from 「Gauche ??? Amazon Web Services??? : torus solutions!」)。XML部分はボディーの部分なので、多値を受け取るようにしておく必要があります(後述のまとめを参照)。
文字コード変換する
次のようにするのがお約束(?)のようです:
(use gauche.charconv) (let* ((raw-in (open-input-string str)) (in (open-input-conversion-port raw-in 'utf-8))) ;; do something ;; (display in) )
strの部分に変換する前の文字列を指定する。
XMLをS式に変換する
XMLをS式にしたものをSXMLと呼びます。sxml.ssaxモジュールを用いて、変換コマンドを使用できるようにします:
(use sxml.ssax) (ssax:xml->sxml xml '())
xmlの部分にXML形式の文字列を指定してください。
まとめ
私のtumblrから引用を、テキスト形式に変更して取得するには次のようにします:
(use rfc.http) (use sxml.ssax) (use gauche.charconv) ;; http-getは多値を返すので、多値を受け取る ;; XML部分はbody部分だけのため、 ;; http-get の戻り値を ssax:xml->sxml するとエラーになる ;; from http://torus.jp/memo/x200607/aws.rd.html (define (get-sxml-from-tumblr user) (let-values (((status header body) (http-get (string-append user ".tumblr.com") "/api/read?type=quote?filter=text"))) ;; status codeが200でなければ、空リストを返す (when (not (equal? status "200")) '()) ;; XMLが返ってきていれば、 SXML に変換する (let* ((raw-in (open-input-string body)) (in (open-input-conversion-port raw-in 'utf-8))) (ssax:xml->sxml in '()))))
このようにしてから、REPLで
gosh> (get-sxml-from-tumblr "kazu634)
とすれば取得したXMLをSXMLに変換したものが表示されます。
- 作者: Kahuaプロジェクト,川合史朗
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/03/14
- メディア: 大型本
- 購入: 22人 クリック: 713回
- この商品を含むブログ (272件) を見る