疑问:如何使用url-retrieve函数?

当我查看有关该函数的文档时:
url-retrieve

which lets you run a callback function after the page has been retrieved. 
(下面是另外一个函数,不过这个我不需要)
See also ‘browse-url-emacs if you just want to load a URL into a buffer
(opens in another window).

我想要知道的是:
这个callback函数到底怎么获取url-retrieve所下载的数据,然后解析到一个变量之中?
在查阅 insert-translated-name.el 源代码 的时候,我发现其对于CALLBACK(按照我查阅的资料,所有的数据处理,发生在提供给url-retrieve函数的回调函数之中)的代码如下(我参考了对于有道部分的处理,因为这跟我想要做的事情差不多):

(defun insert-translated-name-youdao-retrieve-callback (&optional redirect word style insert-buffer placeholder)
  (let (json word translation result)
    ;; Get translation.
    (set-buffer-multibyte t)
    (goto-char (point-min))
    (when (not (string-match "200 OK" (buffer-string)))
      (error "Problem connecting to the server"))
    (re-search-forward "^$" nil 'move)
    (setq json (json-read-from-string
                (buffer-substring-no-properties (point) (point-max))))
    (kill-buffer (current-buffer))
    (setq translation (elt (assoc-default 'translation json) 0))

    ;; Insert result with placeholder point.
    (insert-translated-name-update-translation-in-buffer word style translation insert-buffer placeholder)))

其中

word style insert-buffer placeholder

这几个变量是程序自定义用于导出输出的变量名(为了实现按照风格生成对应字符串(插入变量))
而json是负责处理翻译引擎返回的JSON数据
其余对于buffer的解析(包括闪过前面的header部分也明白)
问题就在于,当我编写类似的代码时:

Contacting host: api.fanyi.baidu.com:443
beginner-translate-main: Wrong type argument: stringp, #<buffer  *http api.fanyi.baidu.com:443*>
uncompressing publicsuffix.txt.gz...done
reference to free variable ‘apple’

从这个情况下看,翻译查询结果应当是成功返回了(百度采取了gzip压缩,所以那个uncompressing应当就是查询结果)
但是,那个buffer我怎么都访问不到,数据也处理不了.
请问这个问题该怎么解决?

不知道你想表达什么。

如果是你引用的这个函数,它用完 buffer 之后就把它杀掉了,所以你无法再访问。

至于怎么处理 buffer 的内容,你看看其内容就明白了:HTTP Header + 空行 + 内容

(url-retrieve "http://example.com"
	      (lambda (status start-time)
                (message "The request is completed in %f seconds"
                         (float-time (time-subtract nil start-time)))
                (display-buffer (current-buffer)))
	      `(,(current-time))
	      'silent
	      'inhibit-cookies)

你引用的函数也写得很清楚:

2 个赞

url-retrieve 得到服务端返回的结果后,需要先解析http响应头,elisp解析http响应头的 办法参见这里 @xuchunyang 大佬的回复

1 个赞