Clojure、Compojure:阅读 Post 请求 RAW Json
Clojure, Compojure: Reading Post Request RAW Json
我能够读取 Post 请求的 RAW 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))))})))
RAW JSON 的 POST 请求
{
"artwork": {
"id": 10,
"name": "DEFAULT"
}
}
使用这一行 (:name (:artwork (:params params)))
从上面的 RAW Json.
中获取 "name" 值
如果我做的不对,请指导我正确的方法是什么?
如果我对你的问题的理解正确,那么你似乎在问是否有更多 "proper" 的方法来获取 :name
并且不那么尴尬的括号嵌套?
要从嵌套关联结构(哈希映射)中检索 :name
等值,您可以使用 get-in
:
(get-in params [:params :artwork :name])
这种方式更简洁、更易于阅读(从左到右),嵌套更少,但它也是一种尝试获取值的更安全方式,因为 get-in
将 return nil
如果在键序列中找不到键。
您似乎在使用 compojure-api,它具有用于输入和输出强制的帮助程序。您可以同时使用 :body
或 :body-params
键来定义模型和验证,有关详细信息,请参阅文档。
这是一个样本假人 api 和 Leiningen:
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
。
希望对您有所帮助。
我能够读取 Post 请求的 RAW 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))))})))
RAW JSON 的 POST 请求
{
"artwork": {
"id": 10,
"name": "DEFAULT"
}
}
使用这一行 (:name (:artwork (:params params)))
从上面的 RAW Json.
如果我做的不对,请指导我正确的方法是什么?
如果我对你的问题的理解正确,那么你似乎在问是否有更多 "proper" 的方法来获取 :name
并且不那么尴尬的括号嵌套?
要从嵌套关联结构(哈希映射)中检索 :name
等值,您可以使用 get-in
:
(get-in params [:params :artwork :name])
这种方式更简洁、更易于阅读(从左到右),嵌套更少,但它也是一种尝试获取值的更安全方式,因为 get-in
将 return nil
如果在键序列中找不到键。
您似乎在使用 compojure-api,它具有用于输入和输出强制的帮助程序。您可以同时使用 :body
或 :body-params
键来定义模型和验证,有关详细信息,请参阅文档。
这是一个样本假人 api 和 Leiningen:
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
。
希望对您有所帮助。