代码之家  ›  专栏  ›  技术社区  ›  Srini

Clojure,Compojure:读取Post请求原始Json

  •  0
  • Srini  · 技术社区  · 8 年前

    我能够读取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”值。

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

    2 回复  |  直到 8 年前
        1
  •  4
  •   Scott    8 年前

    如果我正确理解了你的问题,那么看起来你是在问是否有更“合适”的方法来获取信息 :name

    检索值,例如 从嵌套的关联结构(哈希映射)中,可以使用 get-in

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

    这更整洁、更容易阅读(从左到右),嵌套更少,但它也是尝试获取值的更安全的方法,因为 上车 nil 如果在键序列中找不到键。

        2
  •  1
  •   Tommi Reiman    8 年前

    你似乎在使用 compojure-api :body :body-params

    下面是一个带有 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 从命令行。您应该会看到一个招摇的ui,其中有一个端点,消费 Artwork

    希望这有帮助。