Clojure、Compojure:读取Post请求原始Json
我能够读取Post请求的原始JSON。但我不确定我做得对不对 代码Clojure、Compojure:读取Post请求原始Json,clojure,compojure,compojure-api,Clojure,Compojure,Compojure Api,我能够读取Post请求的原始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.tool
(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”值
如果我做得不对,请指导我什么是正确的方法?如果我正确理解了你的问题,你似乎在问是否有一种更“正确”的方法来获取
:name
,而不需要太麻烦的括号嵌套
要从嵌套的关联结构(哈希映射)中检索值,如:name
,可以使用get-in
:
(get-in params [:params :artwork :name])
这更整洁,更容易阅读(从左到右),嵌套更少,但它也是尝试获取值的更安全的方法,因为如果在键序列中找不到键,
get in
将返回nil
。如果我正确理解了您的问题,看起来您是在问是否有更“正确”的获取:name
的方法是否可以减少括号嵌套的麻烦
要从嵌套的关联结构(哈希映射)中检索值,如:name
,可以使用get-in
:
(get-in params [:params :artwork :name])
这更整洁、更容易阅读(从左到右),嵌套更少,但也是尝试获取值的更安全的方法,因为get-in
如果在键序列中找不到键,将返回nil
。您似乎正在使用,它有用于输入和输出强制的帮助程序。您可以使用:body
或:body params
键来定义模型和验证,有关详细信息,请参阅文档
下面是一个示例虚拟api,其中包含:
将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)))))
然后从命令行运行leinringserver
。您应该会看到一个有一个端点的大摇大摆的ui,以客户定义的格式(JSON、EDN或Transit)使用Artwork
希望这有帮助。您似乎正在使用,它有输入和输出强制的帮助。您可以使用:body
或:body params
键来定义模型和验证,有关详细信息,请参阅文档
下面是一个示例虚拟api,其中包含:
将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)))))
然后从命令行运行leinringserver
。您应该会看到一个有一个端点的大摇大摆的ui,以客户定义的格式(JSON、EDN或Transit)使用Artwork
希望这有帮助