2012-07-24 42 views
1

繼發是我的elisp的代碼(憑證顯然是僞造的):額外的頭未通過url.el

(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調用?

謝謝!

回答

1

您並未評估您的assembla-auth-header變量,並且您在let之外呼叫url-retrieve,此時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)))))) 

我會建議嘗試這樣的事情,看是否這至少沿着通過正確接受授權頭。

+0

非常感謝,不幸的是我得到了兩個頭接受Accept,如:Accept:*/* User-Agent:URL/Emacs(x86_64-pc-linux-gnu; TTY) Accept:application/xml – user652650 2012-07-24 11:57:44

+0

@ user652650我做了一個快速的'Mx apropos',發現'url-mime-accept-string'也許可以工作?我不知道,但它看起來像額外的頭不覆蓋原來的。 – ryuslash 2012-07-24 14:06:21