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

発信要求ヘッダーの監視に基づいて、「Accept」ヘッダーが設定されていません。コメントアウトされた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))))))

このようなことを試して、これが少なくともAcceptヘッダーとAuthorizationヘッダーを正しく通過するかどうかを確認することをお勧めします。

于 2012-07-24T07:59:39.327 に答える