Improve
This commit is contained in:
parent
9ef6e78400
commit
405c43da14
1 changed files with 30 additions and 28 deletions
|
@ -11,7 +11,8 @@
|
||||||
#:parse)
|
#:parse)
|
||||||
(:import-from #:dexador
|
(:import-from #:dexador
|
||||||
#:request
|
#:request
|
||||||
#:http-request-failed)
|
#:http-request-failed
|
||||||
|
#:response-status)
|
||||||
(:import-from #:quri
|
(:import-from #:quri
|
||||||
#:make-uri
|
#:make-uri
|
||||||
#:render-uri)
|
#:render-uri)
|
||||||
|
@ -26,30 +27,31 @@
|
||||||
(defparameter *api-key* nil)
|
(defparameter *api-key* nil)
|
||||||
(defparameter *service-domain* nil)
|
(defparameter *service-domain* nil)
|
||||||
|
|
||||||
(defun %request (method endpoint &optional (path "") (query nil) (content nil))
|
(defun %request (method endpoint &key path query content)
|
||||||
(let* ((url (%build-uri endpoint path query))
|
(or *service-domain* (error "microcms:*service-domain* is not configured."))
|
||||||
(headers `(("X-MICROCMS-API-KEY" . ,*api-key*)
|
(or *api-key* (error "microcms:*api-key* is not configured."))
|
||||||
("Content-Type" . "application/json"))))
|
(let* ((url (%build-uri endpoint :path path :query query))
|
||||||
(format t "API request url: ~a~%" url)
|
(req-headers `(("X-MICROCMS-API-KEY" . ,*api-key*)
|
||||||
|
("Content-Type" . "application/json"))))
|
||||||
(handler-case
|
(handler-case
|
||||||
(multiple-value-bind (res-body status resp-headers)
|
(multiple-value-bind (res-body status res-headers)
|
||||||
(request url
|
(request url
|
||||||
:method method
|
:method method
|
||||||
:headers headers
|
:headers req-headers
|
||||||
:content (and content (to-json content))
|
:content (and content (to-json content))
|
||||||
:force-binary nil)
|
:force-binary nil)
|
||||||
(format t "API response status: ~a~%" status)
|
(format t "microCMS status: ~D~%" status)
|
||||||
(when (and (stringp res-body)
|
(when (and (stringp res-body)
|
||||||
(search "application/json" (gethash "content-type" resp-headers)))
|
(search "application/json" (gethash "content-type" res-headers)))
|
||||||
(parse res-body)))
|
(parse res-body)))
|
||||||
(http-request-failed ()
|
(http-request-failed (e)
|
||||||
'(:|error| "API request failed")))))
|
(format *error-output* "microCMS status: ~D~%" (response-status e))))))
|
||||||
|
|
||||||
(defun %build-uri (endpoint &optional (path "") (query nil))
|
(defun %build-uri (endpoint &key path query)
|
||||||
(let ((uri (make-uri
|
(let ((uri (make-uri
|
||||||
:scheme "https"
|
:scheme "https"
|
||||||
:host (format nil "~A.microcms.io" *service-domain*)
|
:host (format nil "~A.microcms.io" *service-domain*)
|
||||||
:path (format nil "/api/v1/~A/~A" endpoint path)
|
:path (format nil "/api/v1/~A~@[/~A~]" endpoint path)
|
||||||
:query (%build-query query))))
|
:query (%build-query query))))
|
||||||
(render-uri uri)))
|
(render-uri uri)))
|
||||||
|
|
||||||
|
@ -60,28 +62,28 @@
|
||||||
(defmacro define-list-client (endpoint)
|
(defmacro define-list-client (endpoint)
|
||||||
(let ((str-endpoint (string-downcase (string endpoint))))
|
(let ((str-endpoint (string-downcase (string endpoint))))
|
||||||
`(progn
|
`(progn
|
||||||
(defun ,(symbolicate 'get- endpoint '-list) (&optional query)
|
(defun ,(symbolicate 'get- endpoint '-list) (&key query)
|
||||||
(%request :get ,str-endpoint nil query))
|
(%request :get ,str-endpoint :query query))
|
||||||
(defun ,(symbolicate 'get- endpoint '-list-detail) (id &optional query)
|
(defun ,(symbolicate 'get- endpoint '-list-detail) (id &key query)
|
||||||
(%request :get ,str-endpoint id query))
|
(%request :get ,str-endpoint :path id :query query))
|
||||||
(defun ,(symbolicate 'create- endpoint) (content &optional query)
|
(defun ,(symbolicate 'create- endpoint) (content &key query)
|
||||||
(let ((id (getf content :|id|)))
|
(let ((id (getf content :|id|)))
|
||||||
(%request (if id :put :post)
|
(%request (if id :put :post)
|
||||||
,str-endpoint
|
,str-endpoint
|
||||||
id
|
:path id
|
||||||
query
|
:query query
|
||||||
(remove-from-plist content :|id|))))
|
:content (remove-from-plist content :|id|))))
|
||||||
(defun ,(symbolicate 'update- endpoint) (id content)
|
(defun ,(symbolicate 'update- endpoint) (id content)
|
||||||
(%request :patch ,str-endpoint id nil content))
|
(%request :patch ,str-endpoint :path id :content content))
|
||||||
(defun ,(symbolicate 'delete- endpoint) (id)
|
(defun ,(symbolicate 'delete- endpoint) (id)
|
||||||
(%request :delete ,str-endpoint id))
|
(%request :delete ,str-endpoint :path id))
|
||||||
nil)))
|
nil)))
|
||||||
|
|
||||||
(defmacro define-object-client (endpoint)
|
(defmacro define-object-client (endpoint)
|
||||||
(let ((str-endpoint (string-downcase (string endpoint))))
|
(let ((str-endpoint (string-downcase (string endpoint))))
|
||||||
`(progn
|
`(progn
|
||||||
(defun ,(symbolicate 'get- endpoint '-object) ()
|
(defun ,(symbolicate 'get- endpoint '-object) (&key query)
|
||||||
(%request :get ,str-endpoint))
|
(%request :get ,str-endpoint :query query))
|
||||||
(defun ,(symbolicate 'update- endpoint) (content)
|
(defun ,(symbolicate 'update- endpoint) (content)
|
||||||
(%request :patch ,str-endpoint nil nil content))
|
(%request :patch ,str-endpoint :content content))
|
||||||
nil)))
|
nil)))
|
Loading…
Add table
Add a link
Reference in a new issue