Cowboy框架内发送HTTP请求并读取响应体的实现方案咨询
Cowboy框架发送HTTP请求实现方案
Cowboy本身是纯HTTP服务器框架,没有内置对外发送HTTP请求的上层封装,你不需要强行复用Cowboy的服务端能力,直接使用BEAM生态的成熟HTTP客户端即可,无需自己实现Erlang底层网络逻辑。
以下是3种常用的适配方案:
方案1:OTP内置
httpc模块,无额外依赖
适合轻量请求场景,无需引入第三方包,开箱可用:% 先启动inets应用 inets:start(), % 发送GET请求示例 {ok, {{_, StatusCode, _}, RespHeaders, RespBody}} = httpc:request(get, {"https://example.com", []}, [], []), % 直接读取RespBody即可使用注意高并发场景下
httpc的性能和配置灵活度不如第三方客户端。方案2:同生态
gun客户端,和Cowboy适配性最优gun是Cowboy官方开发团队推出的异步HTTP客户端,支持HTTP/1.1、HTTP/2、长连接、流式响应,和Cowboy项目适配度最高,适合生产环境使用:% 建立目标服务连接 {ok, ConnPid} = gun:open("example.com", 443, #{transport => tls}), % 等待连接就绪 {ok, http} = gun:await_up(ConnPid), % 发送GET请求 StreamRef = gun:get(ConnPid, "/", []), % 接收响应头 {response, nofin, StatusCode, RespHeaders} = gun:await(ConnPid, StreamRef), % 读取完整响应体 {ok, RespBody} = gun:await_body(ConnPid, StreamRef), % 按需关闭连接,长连接场景可复用ConnPid gun:close(ConnPid)方案3:其他第三方客户端
可以根据项目技术栈选择hackney等常用HTTP客户端,所有客户端逻辑都可以直接在Cowboy的handler回调中执行,没有兼容性限制。
额外说明:Cowboy的handler仅用于处理外部流入的请求,对外发请求属于独立的客户端逻辑,两者不需要做特殊绑定,直接在handler的业务代码中调用上述客户端逻辑即可。
内容的提问来源于stack exchange,提问作者o-0
相关产品推荐
相关产品推荐

