【问题标题】:Clojure, Compojure: Reading Post Request RAW JsonClojure,Compojure:阅读帖子请求 RAW Json
【发布时间】:2017-07-25 12:10:23
【问题描述】:

我能够读取 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 中获取“名称”值。

如果我的方法不对,请指导我正确的方法是什么?

【问题讨论】:

    标签: clojure compojure compojure-api


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      您似乎正在使用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

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2018-01-01
        • 2018-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-26
        • 1970-01-01
        • 2014-09-13
        • 2011-11-05
        相关资源
        最近更新 更多