2017-07-25 102 views
0

我可以读取邮寄请求的RAW JSON。但不知道我是否正确地做到了这一点?Clojure,Compojure:阅读邮政请求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))))}))) 

RAW的JSON POST请求

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

使用这条线(:name (:artwork (:params params)))抓取从上述原始JSON “名称” 的值。

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

回答

3

如果我正确理解你的问题,它看起来像你问是否有一个更“适当”的方式来获取:name括号嵌套较少尴尬?

在嵌套关联结构检索值,如:name(哈希地图),您可以使用get-in

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

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

1

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

希望这会有所帮助。