У меня создалось впечатление, что 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))
))))
Спасибо за ваш комментарий. Я читаю источники из twit.el, twitter.el и mediawiki.el, но я не смог проанализировать, что именно они делают для аутентификации. Я тоже проверю твое. Еще раз спасибо! – wallyqs
Совсем другое решение может заключаться в том, чтобы не использовать url.el - я просто просмотрел режим идентификации (просто Google для него), и HTTP-запрос собран полностью вручную. Для меня это немного похоже на изобретательство колеса. –
Режим twiter, который я использую (twit.el), не выполняет программную проверку подлинности, но полагается на url.el - то есть пользователь получает запрос по первому запросу для имени и пароля Twitter. –