4

我正在尝试使用 Stack Exchange API 获取站点列表(a 列表列表)request.el

我正在为 Stack Exchange 制作 Emacs 主要模式,因此这对 Emacs 用户来说有一些不错的潜在回报。;) (而且由于我标记了 elisp,我假设这就是你们的大部分。)

要做到这一点,一个基本的必要条件是发出一个 JSON 请求,然后查看返回的站点列表。StackExchange API 提供/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 的调用次数,并将它们全部检索并一次性将它们放入数据结构中,以便我以后能够理解它。

我正在尝试调整我在这里找到的一个可爱的解决方案,在 Emacs 中发出 JSON 请求,以适应我需要做的事情。它使用来自 tkf 的request.el库。

tkf 给我的示例能够获取站点上最活跃的问题并使用 获取其titletags属性json-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)))))

两个变化: 1.使用json-read而不是buffer-string解析器参数。2. 使用launch_date而不是launch-date作为alist 的键。

于 2013-03-03T23:38:25.010 回答