0

我能够阅读 Post Request 的 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))))})))

POST 请求的原始 JSON

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

使用此行(:name (:artwork (:params params)))从上述 RAW Json 中获取“名称”值。

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

4

2 回答 2

4

如果我正确理解了您的问题,那么您似乎在问是否有一种更“正确”的方式来获取:name更少笨拙的括号嵌套?

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

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

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

于 2017-07-25T13:35:39.513 回答
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,Artwork以客户端定义的格式(JSON、EDN 或 Transit)消费。

希望这可以帮助。

于 2017-07-25T20:43:38.890 回答