Drakma メモ (2)
再び郵便番号API。検索結果が多いときは、複数のリクエストが必要になる。定義されているAPI通りに、ページを順番に取っていく。
(defun retrieve-from-zip-ricollab (query) (let ((uri (format nil "http://zip.ricollab.jp/search?q=~a&type=json" query))) (loop for page from 0 with result = nil do (format t "page: ~a~%" page) (multiple-value-bind (body status-code) (http-request uri :method :get :want-stream t :external-format-out :utf-8 :additional-headers nil) (case status-code ((200) (let ((page (json:decode-json body))) (setq result (append result (cdr (assoc :result page)))) (if (assoc :next page) (setq uri (cdr (assoc :next page))) (loop-finish)))) (t (error "got status ~a" status-code)))) finally (return result))))
こういう、検索すると複数のページが返ってくる、というのはよくあって、twitter の検索APIもこんな感じだった。郵便番号は静的だけど。ということはもうちょっと奇麗に書けなくてはいけない。で、cl-twitter に with-paging というのがあるので後で見ることにする(あんまり抽象化されていないっぽいが、、)。