2013-03-21 3 views
3

) drakma을 사용하여 웹 서비스에 일부 JSON 데이터를 POST하려고합니다. 데이터가 JSON에 확인을 인코딩 할 보인다 drakma에 의해 생성 된 헤더도, 내가 생각하지만POST JSON 데이터 (drakma : 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*) 

은 불행히도, 난, 오류가 발생합니다. 분명히 :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

+0

@wvxvw 귀하의 조언에 많은 감사드립니다. 문제는 cl-ssl의 최신 버전에서 알려진 버그로 인해 발생한다는 것이 밝혀졌습니다. 지금 대답에 대한 자세한 내용을 알려 드리겠습니다. – piokuc

+0

@wvxvw 해결책의 내용을 담은 답변을 게시했습니다 – piokuc

답변

3

Drakma 및 Chunga drakma-devel의 일반 관심 목록에서 Kevin 및 Hans에게 도움을 주신 데 대해 감사드립니다. 문제는 cl + ssl의 최신 버전의 버그로 인해 발생한 것으로 밝혀졌습니다. 개발 지점. 내가 quicklisp을 사용하고, 여기에 한스 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 릴리스로 업그레이드 한 후에 해당 체크 아웃을 제거하십시오.

+1

고정 된 버전의 cl + ssl이 이제 quicklisp의 패키지 목록에 있습니다. – dcolish

+0

@dcolish 정보를 제공해 주셔서 감사합니다. – piokuc

관련 문제