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

希望对您有所帮助。