使用drakma POST POST JSON数据:http-request
问题描述:
我想使用drakma将一些JSON数据发布到Web服务。使用drakma POST POST JSON数据:http-request
(ql:quickload :st-json)
(ql:quickload :cl-json)
(ql:quickload :drakma)
(defvar *rc* (merge-pathnames (user-homedir-pathname) ".apirc"))
(defvar *user*
(with-open-file (s *rc*)
(st-json:read-json s)))
(defvar api-url (st-json:getjso "url" *user*))
(defvar api-key (st-json:getjso "key" *user*))
(defvar api-email (st-json:getjso "email" *user*))
(setf drakma:*header-stream* *standard-output*)
(defvar *req* '(("date" . "20071001") ("time" . "00") ("origin" . "all")))
(format t "json:~S~%" (json:encode-json-to-string *req*))
(defun retrieve (api request)
(let* ((cookie-jar (make-instance 'drakma:cookie-jar))
(extra-headers (list (cons "From" api-email)
(cons "X-API-KEY" api-key)))
(url (concatenate 'string api-url api "/requests"))
(stream (drakma:http-request url
:additional-headers extra-headers
:accept "application/json"
:method :post
:content-type "application/json"
:external-format-out :utf-8
:external-format-in :utf-8
:redirect 100
:cookie-jar cookie-jar
:content (json:encode-json-to-string request)
:want-stream t)))
(st-json:read-json stream)))
(retrieve "/datasets/tigge" *req*)
不幸的是,我得到一个错误,尽管数据似乎编码确定以JSON和drakma产生的头也一样,我想。显然,:content
(错误消息中的整数列表仅仅是JSON编码数据的ASCII代码列表)出了问题。
json:"{\"date\":\"20071001\",\"time\":\"00\",\"origin\":\"all\",\"type\":\"pf\",\"param\":\"tp\",\"area\":\"70\\/-130\\/30\\/-60\",\"grid\":\"2\\/2\",\"target\":\"data.grib\"}"
POST /v1/datasets/tigge/requests HTTP/1.1
Host: api.service.int
User-Agent: Drakma/1.3.0 (SBCL 1.1.5; Darwin; 12.2.0; http://weitz.de/drakma/)
Accept: application/json
Connection: close
From: [email protected]
X-API-KEY: 19a0edb6d8d8dda1e6a3b21223e4f86a
Content-Type: application/json
Content-Length: 193
debugger invoked on a SIMPLE-TYPE-ERROR:
The value of CL+SSL::THING is #(123 34 100 97 116 97 115 101 116 34 58 34
...), which is not of type (SIMPLE-ARRAY
(UNSIGNED-BYTE 8)
(*)).
任何想法这个代码有什么问题吗?提前谢谢了。
答
感谢Kevin和Hans从Drakma和Chunga drakma-devel的一般兴趣列表中帮助我 - 事实证明,问题是由最近版本的cl + ssl中的一个错误引起的,已经修复开发分支。我用quicklisp,这里是什么汉斯棉铃虫建议我做到及时更新我的CL + SSL安装,它的工作:
您可以检查出最新的CL + SSL - 其中包含了 问题的修正:
cd ~/quicklisp/local-projects/ git clone git://gitorious.org/cl-plus-ssl/cl-plus-ssl.git
Quicklisp会自动从该位置查找cl + ssl。在升级到较新版本的quicklisp 发行版后,请记住 以删除该结帐。
@wvxvw谢谢,我会检查flexi-stream,但我认为问题在于发送。我以同样的方式在不同的函数中读取json,它会执行GET,并且它工作正常。 – piokuc 2013-03-22 08:23:51
@wvxvw非常感谢您的建议。事实证明,这个问题是由最近版本的cl-ssl中的一个已知错误引起的。我现在将给出详细的答案。 – piokuc 2013-03-22 09:51:31
@wvxvw我发布了解答的详细解答 – piokuc 2013-03-22 09:58:44