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

Compojure - Making HTTP call when route is hit

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

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

对此的最佳做法和格式是什么 - 我可能在这里遗漏了路由/响应预期中的一些关键概念。非常感谢!

我推荐库 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 returns 包含响应状态代码和 headers 等内容的地图。

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

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

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

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


如果您想通过一些示例快速获得某些东西 "that just works",并 运行,Luminus 可能会有用。它是一个精选的 collection 库,证明对大多数网络服务器很有用。 (免责声明:我只对 Luminus 进行了最低限度的试验,选择更明确地理解我的依赖项)。

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