问题标签 [httpurlconnection]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 如何在 HTTPUrlConnection 中取消设置 ContentHandlerFactory
HTTPUrlConnection.setContentHandlerFactory()
方法抛出异常说工厂已经定义。我明白那个。是否可以取消设置工厂并更改内容处理程序工厂?
java - 在 Activity 进行 HTTP 连接之前,Android 服务无法进行 HTTP 连接
这是我的帖子:
我试图让自己尽可能清楚:
- 我的应用程序中的类的描述
- 代码架构的描述(由服务和活动)
- 描述应该发生的事情
- 描述实际发生的事情
- 日志猫
- 源代码
应用类说明
我的申请中有:
- 启动时启动的服务,由
MAJService
类管理 - 由
ConsoNRJ
班级管理的活动 - 一个工作类,它将通过 HTTP 获取 HTML 页面,称为
MAJDonnees
- 一个被调用的助手类,
InfosConso
它将实例化一个MAJDonnees
工作者。
处理说明
当服务启动时,它将:
- 创建一个
InfosConso
对象 - 这个
InfosConso
对象将创建一个MAJDonnees
- 这个
MAJDonnees
对象将使用 HTTP 查询HttpURLConnection
该活动几乎相同:
- 创建一个
InfosConso
对象 - 这个
InfosConso
对象将创建一个MAJDonnees
- 此
MAJDonnees
对象将创建一个AsyncTask
,然后使用HttpURLConnection
您可以看到一个可以帮助您理解我的代码的图表:
code.google.com/p/consonrj/wiki/CodeStructure
应该发生什么
由于 Activity 和 Service 基本上运行相同的代码(在MAJDonnees
类中),它们的行为方式应该完全相同:获取 HTML 页面并解析它们
实际发生了什么
从服务运行时,在HttpURLConnections
处理时返回错误结果MAJDonnees
。调用的HttpURLConnections
实例h
给出了无效的 HTTP 响应:h.getResponseCode()
返回 -1。
我不知道如何获得更多的调试信息。
但是,如果活动已启动,HTTP 连接在处理时工作MAJDonnees
,确实h.getResponseCode()
返回 200(HTTP 200 OK)。
那么如果服务再次运行(它计划每 x 分钟运行一次),HTTP 连接就会工作!
日志猫
您可以先运行服务的 logcat,然后运行活动,然后再运行服务,然后查看行为。
http://pastebin.com/DGc8fym2
对不起是法语,希望你还能猜到!:)
源代码
如果您愿意,可以在以下位置查看整个源代码:
code.google.com/p/consonrj/source/browse/#svn/trunk
我希望你能帮我调试这个!我的服务需要在设备启动时和每 x 小时/天从 Internet 获取数据,并且不需要首先启动活动!
谢谢。
java - HttpURLConnection:有必要调用connect()吗?
我见过的许多例子都没有明确地调用connect()
. 相反,他们只是使用getInputStream()
or getResponseCode()
。
我假设所有这些需要连接的 HttpURLConnection 方法都只是调用connect()
它们自己?
是否存在connect()
必须显式调用 HttpURLConnection 的情况?
java - HttpURLConnection:必须阅读整个响应有什么关系?
我目前的问题与这个非常相似。
我有一个downloadFile(URL)
函数可以创建一个新的 HttpURLConnection,打开它,读取它,返回结果。当我在同一个 URL 上多次调用此函数时,第二次几乎总是返回 -1 的响应代码(但不会抛出异常!!!)。
该问题的最佳答案非常有帮助,但我试图理解一些事情。
那么,如果将 http.keepAlive 设置为 false 可以解决问题,那么它究竟表明了什么?服务器以违反 http 协议的方式响应?或者更有可能,我的代码在某种程度上违反了协议?痕迹会告诉我什么?我应该寻找什么?
这有什么关系:
您需要从错误流中读取所有内容。否则,它将混淆下一个连接,这就是 -1 的原因。
这是否意味着如果响应是某种类型的错误(这将是什么响应代码?),流必须被完全读取?此外,每次我尝试一个 http 请求时,我基本上都是在创建一个新连接,然后disconnect()
在最后对其进行 ing。
但是,就我而言,我没有得到 401 或其他什么。它总是 200。但我的第二次连接几乎总是失败。这是否意味着我应该读取其他一些我没有读取的数据(以类似的方式必须完全读取错误流)?
请帮助阐明这一点?我觉得我缺少一些基本的 http 协议理解。
PS 如果我只是使用 Apache HttpClient,我是否不必处理所有这些协议细节?它会照顾我的一切吗?
java - 如何使用 java.net.URLConnection 触发和处理 HTTP 请求
java.net.URLConnection
这里经常被问及使用,Oracle 教程对此过于简洁。
该教程基本上只展示了如何触发GET请求并读取响应。它没有在任何地方解释如何使用它来执行POST请求、设置请求标头、读取响应标头、处理 cookie、提交 HTML 表单、上传文件等。
那么,如何使用java.net.URLConnection
来触发和处理“高级”HTTP 请求呢?
buffer - 阅读 HttpURLConnection InputStream - 手动缓冲区还是 BufferedInputStream?
读取 HttpURLConnection 的 InputStream 时,是否有理由使用以下其中之一?我已经在示例中看到了两者。
手动缓冲:
缓冲输入流
编辑一般来说,我对 HTTP 还是很陌生,但我想到的一个考虑是,如果我使用的是持久 HTTP 连接,我不能在输入流为空之前读取,对吗?在那种情况下,我不需要读取消息长度并只读取该长度的输入流吗?
同样,如果不使用持久连接,我包含的代码在正确读取流方面是否 100% 好?
xml - 如何使用 JSP 读取远程网站上的 XML 文件?
我在我的应用程序中使用 java servlet 和 jsp,我需要读取远程 XML 文件并将其正确呈现为 HTML 并显示在网页上……读取过程使用什么技术?我应该使用 HTTPURLConnection 类吗?读取xml文件的内容还是有其他方法?另外,如果我使用 servlet 作为控制器,使用 JSP 作为视图,那么 servlet 和 jsp 在这个过程中的职责是什么?servlet 是否应该只读取整个 XML 文件,然后将读取的输出传递给 JSP,JSP 将只打印例如,它并使用 XSL 正确呈现?
我真的希望听到任何可以提供帮助的人的消息,
亲切的问候
java - 从 urlconnection 的输入流读取时速度变慢(即使使用 byte[] 和缓冲区)
好的,所以在花了两天时间试图找出问题并阅读了大量文章之后,我终于决定鼓起勇气寻求一些建议(我第一次来这里)。
现在到手头的问题 - 我正在编写一个程序,它将解析游戏中的 api 数据,即战斗日志。数据库中会有很多条目(20+ 百万),因此每个战斗日志页面的解析速度非常重要。
要解析的页面如下所示:http://api.erepublik.com/v1/feeds/battle_logs/10000/0。 (如果使用 chrome,请参阅源代码,它不会正确显示页面)。它有 1000 个命中条目,然后是一些战斗信息(最后一页显然会小于 1000)。平均而言,一个页面包含 175000 个字符,UTF-8 编码,xml 格式(v 1.0)。程序将在一台好的 PC 上本地运行,内存几乎是无限的(因此创建 byte[250000] 是完全可以的)。
格式从不改变,非常方便。
现在,我像往常一样开始:
这是有趣的部分开始的地方。我运行了一些分析(使用 System.currentTimeMillis())来找出什么需要很长时间,什么不需要。对该方法的调用平均只需要 200 毫秒
网络操作预计需要 200 毫秒,我对此很好。但是,当我以任何方式解析 inputStream(将其读入字符串/使用 java XML 解析器/将其读入另一个 ByteArrayStream)时,该过程需要超过 1000 毫秒!
例如,如果我将上面从 getContentStream() 获得的流 ('is') 直接传递给此方法,则此代码需要 1000 毫秒:
如果传入初始 InputStream 'is',此代码也需要大约 920 毫秒(不要读入代码本身 - 它只是通过直接计算字符来提取我需要的数据,这可以通过严格的 api 提要格式来完成) :
我尝试将默认的 BufferedReader 替换为
这并没有太大变化。我的第二次尝试是将 A 和 B 之间的代码替换为: Iterator it = IOUtils.lineIterator(is, "UTF-8");
相同的结果,除了这次 AB 是 0 毫秒,而 BC 是 1000 毫秒,所以每次调用 it.next() 都必须花费大量时间。(IOUtils 来自 apache-commons-io 库)。
这是罪魁祸首 - 将流解析为字符串所花费的时间,无论是迭代器还是 BufferedReader 在所有情况下都是大约 1000 毫秒,而其余代码花费了 0 毫秒(例如不相关)。这意味着由于某种原因将流解析为 LinkedList 或对其进行迭代会占用我的大量系统资源。问题是——为什么?难道只是java的制作方式......不......那只是愚蠢,所以我做了另一个实验。
在我的主要方法中,我在 getWebPageAsStream() 之后添加:
InputStream->byte[] 转换再次花费了 1000 毫秒 - 这是许多人建议读取 InputStream 的方式,但它仍然很慢。猜猜看——上面的 2 个解析器方法(convertToXML() 和 convertBattlePagetoXMLWithoutDOM(),当传递 'is2' 而不是 'is' 时,在所有 4 种情况下,都在 50 毫秒内完成。
我读了一个建议,即流在解除阻塞之前等待连接关闭,所以我尝试使用 HttpComponentsClient 4.0 ( http://hc.apache.org/httpcomponents-client/index.html ),但最初的 InputStream 花了同样长的时间解析。例如这段代码:
处理时间更长(仅网络需要 50 毫秒)并且流解析时间保持不变。显然它可以被实例化,以免每次都创建 HttpClient 和属性(更快的网络时间),但流问题不会受此影响。
所以我们来到了中心问题 - 为什么初始 URLConnection InputStream(或 HttpClient InputStream)需要这么长时间来处理,而在本地创建的任何相同大小和内容的流都快几个数量级?我的意思是,初始响应已经在 RAM 中的某个地方,与刚从字节 [] 创建相同的流相比,我看不出为什么它的处理速度如此缓慢。
考虑到我必须解析数百万个条目和数千个这样的页面,几乎 1.5 秒/页的总处理时间似乎太长了。
有任何想法吗?
PS请询问是否需要更多代码-解析后我唯一要做的就是制作一个PreparedStatement并将条目以1000+包的形式放入JavaDB,性能还可以~200ms / 1000个条目,prb可以通过更多缓存进行优化但我没有仔细研究它。
java - httpURLConnection vs apache commons http
我只是想知道你们中的任何人在使用 java 默认 HttpURLConnection 类时是否有任何问题。某种使您切换到 apache commons 的错误。
或者仅仅是类公开的(丑陋的)接口证明了第 3 方 http lib 的诞生是合理的?
披露:我听到一些反对 java.net 存在一些严重问题的论点,但我发现很难相信作为 java 核心发行版一部分的类在 JDK 的几个版本之后仍然存在问题
java - getRequestProperty("Authorization") 总是返回 null
我正在尝试读取 HTTP 请求的授权标头(因为我需要向其中添加一些内容),但标头值总是为 null。其他标题工作正常。
难道我做错了什么?这是“安全”功能吗?有没有办法使用 URLConnection 进行这项工作,还是我需要使用另一个 HTTP 客户端库?