2013-03-21 103 views
3

我想使用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) 
                  (*)). 

任何想法這個代碼有什麼問題嗎?提前謝謝了。

+0

@wvxvw謝謝,我會檢查flexi-stream,但我認爲問題在於發送。我以同樣的方式在不同的函數中讀取json,它會執行GET,並且它工作正常。 – piokuc 2013-03-22 08:23:51

+0

@wvxvw非常感謝您的建議。事實證明,這個問題是由最近版本的cl-ssl中的一個已知錯誤引起的。我現在將給出詳細的答案。 – piokuc 2013-03-22 09:51:31

+0

@wvxvw我發佈瞭解答的詳細解答 – piokuc 2013-03-22 09:58:44

回答

3

感謝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 發行版後,請記住 以刪除該結帳。

+1

cl + ssl的固定版本現在位於quicklisp的軟件包列表中。 – dcolish 2013-05-03 05:32:17

+0

@dcolish感謝您的信息。 – piokuc 2013-05-03 07:26:26