【问题标题】:POST JSON data using drakma:http-request使用 drakma:http-request POST JSON 数据
【发布时间】:2013-03-11 13:04:21
【问题描述】:

我正在尝试使用drakma 将一些 JSON 数据发布到 Web 服务。

    (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: me@gmail.com
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)
                                                          (*)).

知道这段代码有什么问题吗?非常感谢。

【问题讨论】:

  • @wvxvw 谢谢,我会检查弹性流,但我认为问题出在发送上。我在另一个函数中以相同的方式读取 json,它执行 GET,它工作正常。
  • @wvxvw 非常感谢您的建议。事实证明,这个问题是由最近版本的 cl-ssl 中的一个已知错误引起的。我现在将在答案中提供详细信息。
  • @wvxvw 我发布了一个包含解决方案细节的答案

标签: json post lisp common-lisp drakma


【解决方案1】:

感谢 Drakma 和 Chunga drakma-devel 的一般兴趣列表中的 Kevin 和 Hans 帮助我 - 原来问题是由最近版本的 cl+ssl 中的错误引起的,该版本已在开发中修复分支。我使用quicklisp,这是 Hans Hübner 建议我更新我的 cl+ssl 安装的方法:

您可以查看最新的 cl+ssl - 其中包含针对 问题:

cd ~/quicklisp/local-projects/
git clone git://gitorious.org/cl-plus-ssl/cl-plus-ssl.git

Quicklisp 会自动从该位置找到 cl+ssl。记住 在您升级到较新的 quicklisp 后删除该结帐 将来会有修复的版本。

【讨论】:

  • cl+ssl 的固定版本现在在 quicklisp 的包列表中。
  • @dcolish 感谢您的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
相关资源
最近更新 更多