1

以下是我的 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)))))

基于监视传出请求标头,未设置“接受”标头。我很确定这就是将我重定向到登录页面的原因,因为注释掉的 curl 请求非常有效并且确实设置了 Accept 标头。

话虽这么说,有什么特别是我做错了,和/或有更好的包装器可以在 elisp 中进行大量 REST 调用吗?

谢谢!

4

1 回答 1

1

您没有评估您的assembla-auth-header变量,而是url-retrieve在您的外部调用let,此时url-request-headers已恢复到其原始状态。似乎您可能需要使用url-mime-accept-string而不是将其添加到额外的标题中。

(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))))))

我建议尝试这样的事情,看看这是否至少正确传递了AcceptAuthorization标头。

于 2012-07-24T07:59:39.327 回答