我是Closure的新手并尝试使用Ring和Compojure。我想在用户点击路由(到第三方API)时发出HTTP请求,然后在我的HTML模板中使用该响应数据 。我知道这可能是一件很容易实现的事情 - 但是对语言和语法不熟悉我有点失落。
(defroutes app
(GET "/" request
; try to GET "https://third-party-api" and do something with the response
)
)
最佳实践和格式是什么 - 我可能会错过路由/响应期望中的一些关键概念。非常感谢!
答案 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。不幸的是,它使用了自己的解构形式,并且包含了更多的魔法,并且只需要知道"比我想要的还要好,但我还没找到对我有用的东西。