首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure,Compojure:原始Json

Clojure,Compojure:原始Json
EN

Stack Overflow用户
提问于 2017-07-25 12:10:23
回答 2查看 834关注 0票数 0

我能够阅读原始JSON的邮政请求。但不确定我做得对不对?

代码语言:javascript
复制
(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

代码语言:javascript
复制
{
  "artwork": {
    "id": 10,
    "name": "DEFAULT"
  }
}

使用这一行(:name (:artwork (:params params)))从上面的原始Json获取"name“值。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-25 13:35:39

如果我正确地理解了您的问题,那么看起来您是在问是否有一种更“适当”的方法来获取:name,而不是笨拙的括号嵌套?

要从嵌套关联结构(散列映射)中检索诸如:name之类的值,可以使用get-in

代码语言:javascript
复制
(get-in params [:params :artwork :name])

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

票数 4
EN

Stack Overflow用户

发布于 2017-07-25 20:43:38

您似乎在使用构造-api,它为输入和输出强制提供了帮助。您可以同时使用:body:body-params键来定义模型和验证,有关详细信息,请参阅文档。

下面是一个带有莱宁根的示例虚拟api

代码语言:javascript
复制
lein new compojure-api artwork
cd artwork

src/artwork/handler.clj的内容设置为:

代码语言:javascript
复制
(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,它以客户机定义的格式(JSON、EDN或Transit)消费Artwork

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45302891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档