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 というのがあるので後で見ることにする(あんまり抽象化されていないっぽいが、、)。