我有一个使用Drakma来获取网页的功能:
(defun scrape ()
(let ((cookie-jar (make-instance 'drakma:cookie-jar)))
(drakma:http-request "http://www.example.com/account/login"
:method :post
:parameters '(("username" . "myusername")
("password" . "mypassword"))
:cookie-jar cookie-jar)
(setq body (drakma:http-request "http://www.example.com/"
:cookie-jar cookie-jar))
(format t body)))
这正如我所料。但是,如果我像这样参数化用户名和密码:
(defun scrape (username password)
(let ((cookie-jar (make-instance 'drakma:cookie-jar)))
(drakma:http-request "http://www.example.com/account/login"
:method :post
:parameters '(("username" . username)
("password" . password))
:cookie-jar cookie-jar)
(setq body (drakma:http-request "http://www.example.com/"
:cookie-jar cookie-jar))
(format t body)))
...并像这样调用它:
(scrape "my_username" "my_password")
...然后我收到以下错误:
*** - Don't know what to do with name/value pair ("username" . USERNAME) in multipart/form-data body.
我是Lisp的新手,所以我100%肯定我在这里缺少一些非常简单的参数。例如。如果我向scrape函数添加格式调用,我可以看到用户名正在正确传递。
答案 0 :(得分:2)
当您使用引号创建文字列表时,引号向下延伸以禁止评估列表的所有成员。您可以看到username
在打印出来时是如何升级的,这是读取符号的默认值。
您必须根据需要使用LIST和CONS表单构建列表结构,或使用允许您有选择地评估片段的反引号,即
(list (cons "username" username) (cons "password" password))
或
`(("username" . ,username) ("password" . ,password))
答案 1 :(得分:1)
引用parameters
的{{1}}参数,因此它没有获得您在alist中传递的字符串,而是获得符号drakma:http-request
和USERNAME
。您需要以这样的方式构造列表,即它在包含它们的上下文中包含参数变量,例如: PASSWORD
。