以下是我的 elisp 代码(凭据显然是假的):
(defvar assembla-username "foo")
(defvar assembla-password "bar")
(defvar tickets-url "http://www.assembla.com/spaces/aWx7Oas2352cwqjQWU/tickets/")
(defvar assembla-auth-header (concat "Basic " (base64-encode-string (concat assembla-username ":" assembla-password))))
; curl -H "Accept: application/xml" -u "foo:bar" http://www.assembla.com/spaces/aWx7Oas2352cwqjQWU/tickets/
(defun get-tickets()
(interactive)
(let ((url-request-extra-headers
'(("Accept" . "application/xml")
("Authorization" . assembla-auth-header)))))
(url-retrieve tickets-url (lambda (status)
(switch-to-buffer (current-buffer)))))
根据监视传出请求 header ,未设置“Accept” header 。我很确定这就是将我重定向到登录页面的原因,因为注释掉的curl请求完美地工作并且确实设置了Accept header 。
话虽这么说,我是否做错了什么,和/或是否有更好的包装器可以在 elisp 中进行大量 REST 调用?
谢谢!
最佳答案
您没有评估您的 assembla-auth-header
变量,并且您在 let
外部调用 url-retrieve
,此时 url-request-headers
已恢复到原始状态。您似乎还需要使用 url-mime-accept-string
而不是将其添加到额外的 header 中。
(defun get-tickets()
(interactive)
(let ((url-mime-accept-string "application/xml")
(url-request-extra-headers
`(("Authorization" . ,assembla-auth-header))))
(url-retrieve tickets-url (lambda (status)
(switch-to-buffer (current-buffer))))))
我建议尝试类似的操作,看看是否至少正确地传递了 Accept 和 Authorization header 。
关于rest - 额外的 header 未通过 url.el 发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11622837/