【问题标题】:Erlang: Connect to API with sockets/gen_tcpErlang:使用 sockets/gen_tcp 连接到 API
【发布时间】:2014-12-21 17:46:35
【问题描述】:

我是 erlang 和整体编程的新手,我正在寻找一种通过使用套接字连接到 twitter API 的方法,如果有的话。 所以我想知道的是,有没有办法在套接字中传递 http 请求/URL 来这样做?

我希望阅读或查看任何信息。 示例代码,我可以在其中看到 gen_tcp、socket、ssl 或任何您认为最聪明的方法。 (连接到推特/发送请求)。

除非我真的需要,否则我不希望使用另一个构建的库。

提前致谢, 埃拉赫

【问题讨论】:

    标签: sockets ssl twitter erlang gen-tcp


    【解决方案1】:

    听起来您需要 HTTP 客户端库。 我看不出有任何理由让您自己通过 TCP 套接字和 gen_tcp 实现 HTTP 协议。 Erlang 标准库已经包含一个名为 httpc 的库。

    还有大量用于一般用途的第三方 http 客户端:

    1. lhttpc
    2. ibroswe
    3. hackney

    对于与 API 的交互,我建议您查看gun。正如项目页面所说,它遵循下一个目标:

    Gun 旨在提供一个易于使用的客户端,兼容 HTTP、SPDY 和 Websocket。

    枪始终处于连接状态。它将保持与 服务器,服务器一关闭就重新打开,节省时间 对于进来的请求。

    所有连接都受到自动监督,允许开发人员 专注于编写代码而不用担心。

    如果您需要更多关于gen_tcp 模块和网络交互的一般信息,我建议您从this great book 开始。

    更新: 更具体地说是关于 twitter 流 API(你的意思是 this one?)。要读取流数据,您可以使用 http 客户端的流接口:

    ok = application:start(inets).
    {ok, Ref} = httpc:request(get, {RequestURL, RequestHeaders}, [], [{sync, false}, {stream, self}]).
    

    之后,您将在进程邮箱中收到以下消息:

    1. 第一条消息是{http, {Ref, stream_start, ResponseHeaders}}
    2. 下一条消息将是{http, {Ref, stream, ResponseBodyChunk}}
    3. 最后一条消息是{http, {Ref, stream_end, ResponseHeaders}}

    在你开始这样的流之后,你应该只通过receive接收进来的消息并根据twitter流协议进行处理。

    请参阅有关 httpc 库的文档。你真的不应该在这里使用gen_tcp 套接字。

    【讨论】:

    • 感谢您的快速回复。这是否意味着您建议我使用 httpc 进行连接和使用套接字来“流式传输”我得到的内容,或者我是否将这些东西混合在一起?
    • 每个 http 客户端都建立在 tcp 套接字之上(特别是,它们已经使用了 gen_tcp)。这意味着 http 客户端会向您隐藏任何特定于 tcp 的详细信息,并且您与 http 客户端界面进行交互时会忽略任何 gen_tcp 特定的详细信息。
    • 作为基本示例,您可以尝试以下操作:httpc:request("http://stackoverflow.com")。此调用将返回 HTTP 响应状态、HTTP 标头和页面正文。
    • 好的,那么如果我想连接到 twitter api,我该怎么做呢?我会发送一个 httpc 请求,然后在 socket recv 中处理传入的数据吗?
    • 我想知道我的想法与这个问题相同:stackoverflow.com/questions/6814695/… 因为我不确定我应该如何使用您建议的其他第三方客户端或库。
    猜你喜欢
    • 2011-08-12
    • 2018-05-02
    • 2018-06-01
    • 2020-05-23
    • 2014-06-26
    • 2012-04-02
    • 2012-09-21
    • 1970-01-01
    • 2014-07-10
    相关资源
    最近更新 更多