如何通过合成管理多个compojure上下文?

时间:2015-11-12 17:57:40

标签: clojure swagger compojure

(请注意,以下示例已从更大的示例中简化)

(ns example-app
  (:require [ring.util.http-response :refer :all]
            [compojure.api.sweet :refer :all]
            [schema.core :as s]))

(defapi my-api
  {:formats [:json]}
  (context* "v0" [] 
    :tags ["unversioned"]
    (GET* "api-endpoint-1" []
      :return Long
      :summary "example endpoint v0/1"
      (ok 123)))
  (context* "v1" []
    :tags ["version-1"]
    (GET* "api-endpoint-2 []
      :return String
      :summary "example endpoint v1/1"
      (ok "hello"))))

所以,鉴于上述情况,我想将其重写为:

(def context-v0 
  (context* "v0" [] 
    :tags ["unversioned"]
    (GET* "api-endpoint-1" []
      :return Long
      :summary "example endpoint v0/1
      (ok 123)))
(def context-v1
  (context* "v1" []
    :tags ["version-1"]
    (GET* "api-endpoint-2 []
      :return String
      :summary "example endpoint v1/1"
      (ok "hello")))      
(defapi my-api
   context-v0
   context-v1)

这将允许我在创建新版本的同时支持旧版本的api,而不必担心一个巨大的单个文件,这个文件可能会被粗心的未来打乱。

现在看来,执行此操作会导致swagger运行,但提取的上下文不会加载。只显示第一种格式的内容。

我是否必须将其扩展到其宏扩展版本才能使其正常工作?有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

我认为这应该有用。

(def v1 '("v0" [] 
          :tags ["unversioned"]
          (GET* "api-endpoint-1" []
              :return Long
              :summary "example endpoint v0/1"
              (ok 123)))
(defapi my-api
        (apply context* v0)
        (apply context* v2))

答案 1 :(得分:0)

只是为遇到这个问题的其他人添加更多替代方案。

(def v1-routes
  (routes
    (GET "/a" [] (ok "Stable A"))
    (GET "/b" [] (ok "Stable B"))))

(def v0-routes
  (routes
    (GET "/a" [] (ok "Next gen A"))
    (GET "/b" [] (ok "Next gen B"))))

(defapi myapi
  (context "/v0" [] v0-routes)
  (context "/v1" [] v1-routes))

遵循这条路线的一个很好的副作用是"安装点"可以在不直接更改v*-routes的情况下更改 (user1_env)root@ubuntu:~/user1/test/compare_files# cat compare.py import pandas as pd source1_df = pd.read_excel('a.xlsx', sheetname='source1') source2_df = pd.read_excel('a.xlsx', sheetname='source2') joined_df = source1_df.join(source2_df, on='Serial') joined_df.to_excel('/root/user1/test/compare_files/result.xlsx') 。子路线不了解其父母背景。