【问题标题】:using Guava's Resources.readLines to read from an HTTP service使用 Guava 的 Resources.readLines 从 HTTP 服务中读取
【发布时间】:2014-01-22 16:12:18
【问题描述】:

我想从 URL 中readLines,该 URL 解析为 HTTP 服务。我可以使用

Resources.readLines(url, Charsets.SOMETHING)

来自com.google.common.io

这可行,但资源类 javadoc 声明如下,无需进一步解释:

请注意,即使这些方法使用 URL 参数,它们通常也不适合 HTTP 或其他非类路径资源。

为什么这种方法不适合从 HTTP 服务读取,推荐的方法是什么?

【问题讨论】:

    标签: java http url guava


    【解决方案1】:

    使用URL发送HTTP请求时,典型流程为

    URL url = new URL(someStringUrl);
    HttpUrlConnection con = (HttpUrlConnection) url.openConnection();
    // do some stuff with con, add headers, add request body, etc.
    con.getInputStream(); // get body of response
    

    ResourcesURL 跳过了所有这些。 Resources 中的方法依赖于URL#openStream(),它会跳过对URLConnection 的任何修改,即。相当于url.openConnection().getInputStream()。由于您的请求不正确,您可能会从 HTTP 响应中获得任意数量的 400 级错误代码。

    这不会发生在类路径资源中,因为协议很简单。您只需复制字节即可。

    【讨论】:

    • 好点。我实际上只尝试了一个不需要标头的简单服务上的 GET 请求。所以我想CharSource 包装ByteSource 创建和准备连接然后返回connection.getInputStream() 是要走的路。 (在这里包装允许您选择一个字符集。)
    • @JoeKearney 对于 HTTP 请求,我真的建议您使用成熟的 Http 客户端。
    • @JoeKearney:是的,如果您想从 HTTP URL 读取数据并且希望能够使用 Guava 的 I/O 实用程序,则打开连接的 ByteSource 设置根据需要向上,然后在openStream()方法中连接并返回输入流可能是要走的路。
    • @ColinD 虽然我们有你在这里,但谷歌有公开可用的 HTTP 客户端吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    相关资源
    最近更新 更多