4

を使用してStackExchangeAPIでサイトのリスト(a-listのリスト)を取得しようとしていますrequest.el

私はStackExchange用にEmacsのメジャーモードを作成しているので、これはEmacsユーザーにとって素晴らしい潜在的な見返りがあります。;)(そして、私はelispにタグを付けたので、それはあなたの多くだと思います。)

これを行うには、基本的にJSONをリクエストしてから、返されたサイトのリストを表示する必要があります。StackExchangeAPIは/sitesリソースを提供し、そのリソースのリクエストは次のようなサイトオブジェクトのコレクションを返します。

{
  "items": [
    {
      "site_type": "main_site",
      "name": "Stack Overflow",
      "logo_url": "http://cdn.sstatic.net/stackoverflow/img/logo.png",
      "api_site_parameter": "stackoverflow",
      "site_url": "http://stackoverflow.com",
      "audience": "professional and enthusiast programmers",
      "icon_url": "http://cdn.sstatic.net/stackoverflow/img/apple-touch-icon.png",
      "aliases": [
        "http://www.stackoverflow.com"
      ],
      "site_state": "normal",
      "styling": {
        "link_color": "#0077CC",
        "tag_foreground_color": "#3E6D8E",
        "tag_background_color": "#E0EAF1"
      },
      "launch_date": 1221436800,
      "favicon_url": "http://cdn.sstatic.net/stackoverflow/img/favicon.ico",
      "related_sites": [
        {
          "name": "Stack Overflow Chat",
          "site_url": "http://chat.stackoverflow.com",
          "relation": "chat"
        }
      ],
      "markdown_extensions": [
        "Prettify"
      ],
      "high_resolution_icon_url": "http://cdn.sstatic.net/stackoverflow/img/apple-touch-icon@2.png"
    },
    {
      "site_type": "main_site",
      "name": "Server Fault",
      "logo_url": "http://cdn.sstatic.net/serverfault/img/logo.png",
      "api_site_parameter": "serverfault",
      "site_url": "http://serverfault.com",
      "audience": "professional system and network administrators",
      "icon_url": "http://cdn.sstatic.net/serverfault/img/apple-touch-icon.png",
      ...
    },
    {
      "site_type": "main_site",
      "name": "Super User",
      ...
    {
      "site_type": "main_site",
      "name": "Meta Stack Overflow",
      ...
    }
    ...
}

APIに対して行う呼び出しの数を最小限に抑え、それらをすべて取得して、後で理解できるように一度にデータ構造に配置したいと思います。

私はここで見つけた素敵なソリューションの1つであるEmacs内でのJSONリクエストの作成を、私が行う必要のあることに合うように適応させようとしています。tkfのrequest.elライブラリを使用します。

tkfが私に与えた例は、サイトで最も活発な質問を取り、それとプロパティを使用してtitle取得することができました。これは基本的にオブジェクトをリストに変換します。この試みは、その解決策に基づいています。tagsjson-read

(request
 "https://api.stackexchange.com/2.1/sites"
 :parser 'buffer-string
 :success (function*
       (lambda (&key data &allow-other-keys)
         (let* ((items    (assoc-default 'items data))
            (names    (mapcar (lambda (item) (assoc-default 'name        item)) items))
            (launches (mapcar (lambda (item) (assoc-default 'launch-date item)) items)))
           (mapcar* (lambda (name launch)
              (message "name:`%s` launch:`%s`" name launch))
            names
            launches)))))

...しかし、まったく効果がないようです。他の例は完全に機能するので、私の使用法に問題があります。

request.elはMELPAパッケージリポジトリからダウンロードでき、私の知る限り、curl正しく実行する必要があります(私が持っています)。

問題は、の使用法(またはその準備)にあるmapcar*と思われます。ここで、以下は期待どおりに機能します。

(mapcar* (lambda (a b) (insert a) (insert b)) '(1 2 3) '(4 5 6))

この投稿が長いことは知っていますが、できるだけ多くの情報を提供しようとしました。

4

1 に答える 1

0

あなたはほとんどそこにいました。これは私のために働きます:

(request
 "https://api.stackexchange.com/2.1/sites"
 :parser 'json-read
 :success (function*
       (lambda (&key data &allow-other-keys)
         (let* ((items    (assoc-default 'items data))
            (names    (mapcar (lambda (item) (assoc-default 'name        item)) items))
            (launches (mapcar (lambda (item) (assoc-default 'launch_date item)) items)))
           (mapcar* (lambda (name launch)
              (message "name:`%s` launch:`%s`" name launch))
            names
            launches)))))

2つの変更:1 。パーサー引数json-readの代わりに使用します。buffer-string2.リストのキーとしてlaunch_date代わりに使用します。launch-date

于 2013-03-03T23:38:25.010 に答える