我还没有在网上看到一个非常好的例子。如何为这样的请求添加身份验证:
(defun login-show-posts ()
(interactive)
(let ((url-request-method "GET")
(url-request-extra-headers '(("Content-Type" . "application/xml"))))
(url-retrieve "http://localhost:3000/essay/1.xml"
(lambda (status)
(switch-to-buffer (current-buffer))
))))
例如,如果用户和pass是admin:admin?
答案 0 :(得分:7)
我的印象是url.el
主要是为了交互式操作而设计的,即您在未经授权的情况下进行呼叫,服务器会响应403“需要授权”(正确的代码?)状态和url.el
将查询用户的用户名和密码。
您可以在http://github.com/hdurer/fluiddb.el上查看我的代码,我会尝试以编程方式执行操作。
基本上,我自己创建HTTP授权标头(base64编码正确格式化的字符串并将正确的标头添加到url-request-extra-headers
)。
然后在第二步中,我需要向url-http-handle-authentication
添加建议,这样如果传递的凭据不可接受,它就不会询问用户。
这感觉好像强奸url.el
,但它对我有用,是我能让它发挥作用的唯一方法。
您的代码看起来像这样:
(defvar xyz-user-name "admin")
(defvar xyz-password "admin")
(defvar xyz-block-authorisation nil
"Flag whether to block url.el's usual interactive authorisation procedure")
(defadvice url-http-handle-authentication (around xyz-fix)
(unless xyz-block-authorisation
ad-do-it))
(ad-activate 'url-http-handle-authentication)
(defun login-show-posts ()
(interactive)
(let ((xyz-block-authorisation t)
(url-request-method "GET")
(url-request-extra-headers
`(("Content-Type" . "application/xml")
("Authorization" . ,(concat "Basic "
(base64-encode-string
(concat xyz-user-name ":" xyz-password)))))))
(url-retrieve "http://localhost:3000/essay/1.xml"
(lambda (status)
(switch-to-buffer (current-buffer))
))))
答案 1 :(得分:3)
使用twit.el,有一点放屁使它工作。身份验证信息存储在alist中。这个列表绑定到变量url-basic-auth-storage
中的符号。
ELISP> (require 'url)
ELISP> (pp url-basic-auth-storage)
url-http-real-basic-auth-storage
ELISP> (pp (symbol-value url-basic-auth-storage))
(("twitter.com:443" ("Twitter API" . "@uTh5tr!n6=="))
("twitter.com:80" ("Twitter API" . "AnotherAuthString==")))
ELISP>
你可能会这样做:
(let ((my-temporary-auth '(("host.com:80" ("Auth Realm" . "@uTH5r!n6==")))))
(url-basic-auth-storage 'my-temporary-auth))
(do-gunk))
这将仅保留用户身份验证信息(如果有的话)。回想一下,twit.el可能是更聪明的方式。