Clojure、Compojure:读取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

我能够读取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.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

希望这有帮助