【问题标题】:Compojure - Making HTTP call when route is hitCompojure - 在路由被命中时进行 HTTP 调用
【发布时间】:2018-10-18 23:52:02
【问题描述】:

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

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

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

【问题讨论】:

    标签: clojure compojure ring


    【解决方案1】:

    我推荐使用库 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找到。

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


    如果您想通过一些示例快速启动并运行“刚刚好”的东西,Luminus 可能会很有用。这是一个精选的库集合,证明对大多数网络服务器都很有用。 (免责声明:我只对 Luminus 进行了最低限度的试验,选择更明确地了解我的依赖项)。

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

    【讨论】:

    • 非常感谢您的详尽回答和推荐的中间件/库,它们也可能会有所帮助。正是我想要的!
    猜你喜欢
    • 2016-05-02
    • 1970-01-01
    • 2011-04-23
    • 2012-12-31
    • 2013-04-20
    • 2013-12-21
    • 2012-05-31
    • 2020-06-09
    • 2015-05-20
    相关资源
    最近更新 更多