Compojure - 在路由被命中时进行HTTP调用

时间:2018-05-08 23:37:39

标签: clojure compojure ring

我是Closure的新手并尝试使用Ring和Compojure。我想在用户点击路由(到第三方API)时发出HTTP请求,然后在我的HTML模板中使用该响应数据 。我知道这可能是一件很容易实现的事情 - 但是对语言和语法不熟悉我有点失落。

 (defroutes app
    (GET "/" request
      ; try to GET "https://third-party-api" and do something with the response
    )
 )

最佳实践和格式是什么 - 我可能会错过路由/响应期望中的一些关键概念。非常感谢!

1 个答案:

答案 0 :(得分:4)

我建议使用库clj-http来发出http请求。您可以在链接页面上找到许多有关如何使用它的示例。

您对clj-http的使用可能如下所示:

(ns my-app.core
  (:require [clj-http.client :as client]))

...

(defn get-api-data []
  (:body (client/get "https://third-party-api" {:as :json})))

请注意,clj-http.client/get会返回包含响应状态代码和标题等内容的地图。

如果您使用{:as :json}选项将响应强制转换为json,请确保在您的project.clj中包含cheshire(假设您正在使用leiningen)

:dependencies [...
               [clj-http "3.9.0"]
               [cheshire "5.8.0"]]

有关响铃请求和响应的文档可以找到here

环中的大部分功率是它的中间件概念。大多数"很好"您希望在http服务器中使用的功能可以作为环本身或其他库中的中间件找到。例如,如果您希望默认情况下将所有响应序列化为json,则可以使用ring-json

如果你正试图获得某些东西"这只是有效的,快速启动并运行一些示例,Luminus可能会有用。它是一个策划的库集合,对大多数Web服务器都很有用。 (免责声明:我只使用Luminus进行了最低限度的实验,选择更明确地了解我的依赖关系)。

我个人在大多数Web服务项目开始时使用compojure sweet,它包含一些更好的路由功能(包括路径参数)和用于测试端点的swagger UI。不幸的是,它使用了自己的解构形式,并且包含了更多的魔法,并且只需要知道"比我想要的还要好,但我还没找到对我有用的东西。