我能够阅读原始JSON的邮政请求。但不确定我做得对不对?
码
(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请求的原始JSON
{
"artwork": {
"id": 10,
"name": "DEFAULT"
}
}使用这一行(:name (:artwork (:params params)))从上面的原始Json获取"name“值。
如果我做的不是正确的方式,请指导我什么是正确的道路?
发布于 2017-07-25 13:35:39
如果我正确地理解了您的问题,那么看起来您是在问是否有一种更“适当”的方法来获取:name,而不是笨拙的括号嵌套?
要从嵌套关联结构(散列映射)中检索诸如:name之类的值,可以使用get-in。
(get-in params [:params :artwork :name])这样做更整洁,更容易阅读(从左到右),嵌套较少,但这也是尝试获取值的一种更安全的方法,因为如果在键序列中找不到键,get-in将返回nil。
发布于 2017-07-25 20:43:38
您似乎在使用构造-api,它为输入和输出强制提供了帮助。您可以同时使用:body或:body-params键来定义模型和验证,有关详细信息,请参阅文档。
下面是一个带有莱宁根的示例虚拟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,它以客户机定义的格式(JSON、EDN或Transit)消费Artwork。
希望这能有所帮助。
https://stackoverflow.com/questions/45302891
复制相似问题