当前位置: 首页 > 面试题库 >

url.openStream是否有害?

唐默
2023-03-14
问题内容

我正在使用该java.net.URL.openStream()方法从服务器检索内容。最近,我遇到了一个问题,其中HTTP响应代码指示错误,但是仍然抛出了流,而不是抛出异常。这导致该错误在执行中出现得更晚,并被证明是红色鲱鱼。据我所知,当您使用此方法打开流时,无法检查HTTP响应代码。

我能找到正确处理此问题的唯一方法是 打开流 之前 获取连接:

HttpURLConnection conn=(HttpURLConnection) url.openConnection()
#Code updated with scotth's suggestion
if(!String.valueOf(conn.getResponseCode()).startsWith('2'))
    throw new IOException("Incorrect response code "+conn.getResponseCode()+" Message: " +getResponseMessage());
rawIn=conn.getInputStream()

InputStream in=conn.getInputStream()

那你同意吗?是否有任何安全使用openStream的良好条件,或者不建议使用openStream。值得注意的是,Sun使用其教程代码中的方法直接从URL读取。再说一次,代码会引发Exception,因此它并不是良好编码实践的堡垒。


问题答案:

openStream() 如果您想让您的类免受url类型更改的影响,则可以正常工作-
例如在绝对文件路径(file:///),jar包含的资源以及可能还有其他协议的情况下进行更改,甚至可以使用自定义协议处理程序(scotth://foo.bar)。

但是,由于您发现它的抽象度很高,因此,如果您想知道与资源进行交互的性质的任何细节,则需要按照自己的意愿进行openConnection()投射。

回复:其他状态代码-
您可能希望浏览一下RFC2616-如果您关心的只是“成功”,则只需检查即可String.valueOf(conn.getResponseCode()).startsWith('2')



 类似资料:
  • 问题内容: 我正在使用Selenium的WebDriver为我正在进行自我教育的ASP.NET MVC应用程序运行一些SpecFlow测试。 使用,等都需要很长时间才能运行,所以使用它们实际上非常令人沮丧(我认为)。 我已经读过一个据说比基于浏览器的驱动程序快得多的文件。但我似乎在.NET客户端库(仅Java)中找不到版本。是否有.NET版本? 问题答案: 要使用HtmlUnit,您需要使用Rem

  • 问题内容: 没有它是否有效? 有一个标记页面中某些字段的过程,只是找到了一个页面,其中的输入字段没有按我的预期被标记。 我花了一段时间,但得出的结论是,获取表单元素然后获取字段的过程是导致这些表单丢失的原因,因为没有表单。 问题答案: 如果没有出现,则为有效,是的(至少对于html 4.01,请看17.2.1的结尾): 用于创建控件的元素通常出现在FORM元素内部,但当用于构建用户界面时也可能出现

  • 检查提供的参数是否是有效的JSON。 使用 JSON.parse() 和 try... catch 块来检查提供的参数是否是有效的JSON。 const isValidJSON = obj => { try { JSON.parse(obj); return true; } catch (e) { return false; } }; isValidJSON(

  • 问题内容: 在Windows中,有一个文件(其中一个) 包含Java平台的Java源文件。 OSX中的Java 1.6是否有类似的东西?我想在IDE中指定它,以便可以导航到该源。 问题答案: 在我的系统上,src.jar位于/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home中

  • 问题内容: 对于跨进程的数据通信,我打算使用Redis列表。生产者推送到列表,而一组使用者使用BRPOP消费列表内容。 为了限制列表的大小无限增长,我想将列表大小限制为固定值(例如1万个项目)。我很惊讶地没有找到像BLPUSH或BRPUSH这样的等效命令。这是Redis员工故意遗漏的吗? 因此,我假设我必须在推送之前使用Watch / multi创建一个Txn来检查列表大小。这是正确的方法还是可用

  • 问题内容: Python有一个有序的字典。有序套呢? 问题答案: 为此,有一个有序的设置(可能的新链接)配方,可从Python 2文档中引用。它可以在Py2.6或更高版本以及3.0或更高版本上运行,而无需进行任何修改。该接口几乎与普通集合完全相同,不同之处在于初始化应使用列表进行。 这是一个,因此for的签名 的签名不匹配,但是由于它包含类似的内容,因此可以轻松添加: