Clojure,Compojure:阅读帖子请求RAW Json

时间:2017-07-25 12:10:24

标签: clojure compojure compojure-api

我能够阅读Post Request的RAW JSON。但不确定我是否以正确的方式做到了?

CODE

(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请求的RAW JSON

{
  "artwork": {
    "id": 10,
    "name": "DEFAULT"
  }
}

使用此行(:name (:artwork (:params params)))获取" name"来自上述RAW Json的价值。

如果我没有以正确的方式做,请指导我什么是正确的方式?

2 个答案:

答案 0 :(得分:4)

如果我正确地理解了您的问题,那么您似乎在问自己是否有更多正确的问题"如何获取:name并使用较少笨拙的括号嵌套?

要从嵌套关联结构(哈希图)中检索:name之类的值,您可以使用get-in

(get-in params [:params :artwork :name])

这更简洁,更容易阅读(从左到右),嵌套更少,但它也是尝试获取值的更安全的方法,因为get-in如果可以&#{1}}将返回nil 39;在键序列中找到一个键。

答案 1 :(得分:1)

你好像正在使用compojure-api,它有输入和帮助的助手;输出强制。您可以使用:body:body-params键来定义模型和验证,有关详细信息,请参阅文档。

这是一个带有Leiningen的虚拟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-ui,以客户定义的格式(JSON,EDN或Transit)消耗Artwork

希望这有帮助。