我能够阅读Post Request的RAW JSON。但不确定我是否以正确的方式做到了?
CODE
(ns clojure-dauble-business-api.core
(:require [compojure.api.sweet :refer :all]
[ring.util.http-response :refer :all]
[clojure-dauble-business-api.logic :as logic]
[clojure.tools.logging :as log]
[clojure-dauble-business-api.domain.artwork])
(:import [clojure_dauble_business_api.domain.artwork Artwork]))
(defapi app
(GET "/hello" []
(log/info "Function begins from here")
(ok {:artwork (logic/artwork-id 10)}))
(POST "/create" params
(log/info "Create - Function begins from here and body" (:name (:artwork (:params params))))
(ok {:artwork (logic/create-city (:name (:artwork (:params params))))})))
POST请求的RAW JSON
{
"artwork": {
"id": 10,
"name": "DEFAULT"
}
}
使用此行(:name (:artwork (:params params)))
获取" name"来自上述RAW Json的价值。
如果我没有以正确的方式做,请指导我什么是正确的方式?
答案 0 :(得分:4)
如果我正确地理解了您的问题,那么您似乎在问自己是否有更多正确的问题"如何获取:name
并使用较少笨拙的括号嵌套?
要从嵌套关联结构(哈希图)中检索:name
之类的值,您可以使用get-in
:
(get-in params [:params :artwork :name])
这更简洁,更容易阅读(从左到右),嵌套更少,但它也是尝试获取值的更安全的方法,因为get-in
如果可以&#{1}}将返回nil
39;在键序列中找到一个键。
答案 1 :(得分:1)
你好像正在使用compojure-api,它有输入和帮助的助手;输出强制。您可以使用:body
或:body-params
键来定义模型和验证,有关详细信息,请参阅文档。
这是一个带有Leiningen的虚拟api样本:
lein new compojure-api artwork
cd artwork
将src/artwork/handler.clj
的内容设置为:
(ns artwork.handler
(:require [compojure.api.sweet :refer :all]
[ring.util.http-response :refer :all]
[schema.core :as s]))
;; define a Schema for validation
(s/defschema Artwork
{:id Long
:name String})
;; dummy ring-api with swagger-docs
(def app
(api
{:swagger
{:ui "/"
:spec "/swagger.json"
:data {:info {:title "Artwork"
:description "Lovely artwork api"}
:tags [{:name "api", :description "some apis"}]}}}
(context "/api" []
:tags ["api"]
;; endpoint with Schema coercion
(POST "/create" []
:return Artwork
:body [body Artwork]
:summary "creates artwork"
(ok body)))))
并从命令行运行lein ring server
。你应该看到一个带有一个端点的swagger-ui,以客户定义的格式(JSON,EDN或Transit)消耗Artwork
。
希望这有帮助。