Tag: httpurlconnection

Java – 将OutputStream上传为HTTP文件上载

我有一个写入OutputStream的遗留应用程序,我希望将此流的内容作为文件上载到Servlet。 我已经使用JMeter测试了使用commons-fileupload的Servlet,它运行得很好。 我会使用Apache HttpClient,但它需要一个File而不仅仅是一个输出流。 我不能在本地写一个文件; 如果有一些内存中的File实现可能可行吗? 我尝试过使用HttpURLConnection (下面),但服务器响应“MalformedStreamException:Stream意外结束”。 URL url = new URL(“http”, “localhost”, 8080, “/upload”); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); String boundary = “—————————7d226f700d0”; connection.setRequestProperty(“Content-Disposition”, “form-data; name=\”file\””); connection.setRequestProperty(“Content-Type”, “multipart/form-data; boundary=”+boundary); connection.setRequestProperty(“Accept”, “application/json”); connection.setRequestMethod(“POST”); connection.setChunkedStreamingMode(0); connection.connect(); OutputStream out = connection.getOutputStream(); byte[] boundaryBytes =(“–” + boundary + “\r\n”).getBytes(); out.write(boundaryBytes); //App writes to outputstream here out.write(“\r\n”.getBytes()); […]

从WiFi连接切换到3g导致连接挂起?

我有一个连接到Web服务的应用程序。 我可以使用WIFI或3G连接到Web服务,没有任何问题,前提是我在应用程序的生命周期内保持对连接类型的忠诚。 那就是我不从WIFI切换到3G。 如果我从WIFI切换到3G,我再也无法得到响应。 我的联系一直在等待回应。 我尝试了下面的4个场景。 我只对第三种情况有疑问。 可能是什么问题呢? 第一种场景:连接始终在WIFI上(好) 应用程序使用WIFI连接到Web服务。 回复收到成功。 应用程序使用WIFI再次连接到Web服务。 响应成功收到。 第二种场景:连接始终在3G(确定) 应用程序使用WIFI连接到Web服务。 回复收到成功。 应用程序使用WIFI再次连接到Web服务。 响应成功收到。 第三种场景:连接从WIFI切换到3G(无响应) 应用程序使用WIFI连接到Web服务。 回复收到成功。 连接切换到3G。 WIFI已禁用。 3G已启用。 应用程序再次使用3G连接到Web服务。 没有收到回复或错误。 应用程序一直等待响应。 在调用getResponseCode之前显示上一个日志。 第四种场景:连接从3G切换到WIFI(好) 应用程序使用3G连接到Web服务。 回复收到成功。 连接已切换到WIFI。 3G被禁用。 WIFI已启用。 应用程序使用WIFI再次连接到Web服务。 响应成功收到。 我的猜测是默认情况下, HttpURLConnection认为WIFI是一种比3G更好的连接类型。 因此,当连接从WIFI切换到3G时, HttpURLConnection拒绝确认3G并仍尝试使用WIFI进行连接。 另一方面, HttpURLConnection允许从3G切换到WIFI,因为WIFI是更好的连接类型。 我对此是否正确? 如果是这样,我如何允许从WIFI切换到3G? 下面是我的代码片段:(我每次连接到Web服务时都会调用它。) //open new connection httpsURLConnection = (HttpURLConnection) ((new URL(url)).openConnection()); httpsURLConnection.setDoInput(isDoInput); httpsURLConnection.setDoOutput(isDoOutput); […]

检查HTTP POST请求的内容类型到Java servlet

我编写了一个简单的servlet,它接受HTTP POST请求并发回一个简短的响应。 这是servlet的代码: import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.*; /** * Servlet implementation class MapleTAServlet */ @WebServlet(description = “Receives XML request text containing grade data and returns response in XML”, urlPatterns = { “/MapleTAServlet” }) public class MapleTAServlet extends […]

将HTTP 407错误作为IOException

我在我的Android应用程序中使用HttpURLConnection通过需要身份validation的代理。 这是我的代码,我会在遇到问题后解释你。 HttpURLConnection connection = null; int responseCode = -1; try { connection = (HttpURLConnection) myUrl.openConnection(); connection.setInstanceFollowRedirects(false); connection.setConnectTimeout(DEFAULT_TIMEOUT); connection.setReadTimeout(DEFAULT_TIMEOUT); responseCode = connection.getResponseCode(); System.out.println(“ResponseCode = ” + responseCode); } catch (IOException e) { System.out.println(“Exception : ” + e.getMessage()); } 我的问题是我在getResponseCode()方法上得到一个例外,它有以下消息: Failed to authenticate with proxy 。 通常,这个特定的错误有一个http错误代码:407。但是在这里我只得到了一个exception,但没有带有407值的响应代码。 我有解决方案应用登录名和密码连接到代理,但我想只在出现407错误的情况下应用此解决方案(而不是每次我捕获exception)。 任何想法将不胜感激。 谢谢。

通过HttpURLConnection发送UTF-8字符失败

我现在已经花了一半星期天,我需要帮助: 我想使用Java HttpURLConnection将包含特殊字符UTF-8编码的字符串发送到服务器。 字符的正确编码失败。 例: strToSend:äù€ strUrlEncoded:%C3%A4 +%C3%B9 +%E2%82%AC strReceived:â⬠我的代码: urlConnection = (HttpURLConnection) new URL(“http://localhost:8080/NetworkingServer/ServerServlet”).openConnection(); urlConnection.setUseCaches(false); urlConnection.setDoOutput(true); // Triggers POST. urlConnection.setRequestProperty(“accept-charset”, “UTF-8”); urlConnection.setRequestProperty(“content-type”, “application/x-www-form-urlencoded”); String strToSend = “ä ù €”; System.out.println(“strToSend: ” + strToSend); String strUrlEncoded = URLEncoder.encode(strToSend, “UTF-8”); System.out.println(“strUrlEncoded: ” + strUrlEncoded); OutputStreamWriter writer = new OutputStreamWriter(urlConnection.getOutputStream(), “UTF-8”); writer.write(String.format(“content=%s”, strUrlEncoded)); writer.close(); 有任何想法吗?

如何从HttpURLConnection切换到HttpClient

这是我的第一个问题,所以拜托,请耐心等待。 我有一个Swing应用程序,它通过HttpURLConnection从服务器获取XML格式的数据。 现在我正在尝试与服务器创建一个持续的请求 – 响应连接,以检查应用程序是否有任何更新(因为检查必须定期和经常(每隔一秒左右))。 在一些问题的评论中,我读到最好使用Apache HttpClient而不是HttpURLConnection来维护实时连接,但我找不到任何好的例子如何从我当前的代码转到使用HttpClient的代码。 具体来说,使用什么而不是HttpURLConnection.setRequestProperty()和HttpURLConnection.getOutputStream()? Document request = new Document(xmlElement); Document response = new Document(); String server = getServerURL(datasetName); try { URL url = new URL(server); try { HttpURLConnection connection = (HttpURLConnection)url.openConnection(); connection.setRequestProperty(“Content-Type”,”application/xml; charset=ISO-8859-1″); connection.setDoOutput(true); connection.setDoInput(true); connection.setRequestMethod(“POST”); OutputStream output = connection.getOutputStream(); XMLOutputter serializer = new XMLOutputter(); serializer.output(request, output); output.flush(); output.close(); InputStream input […]

使用HttpUrlConnection的NLTM auth失败

我正在尝试使用java.net的HttpUrlConnection对我的Java应用程序中支持NTLM身份validation的服务器进行身份validation。 问题是应用程序无法发送Authenticate响应。 我已将代理连接到http连接,以便通过fiddler路由流量。 在提琴手中,我可以看到正在发送的协商消息,并且收到服务器挑战。 但在此之后,应用程序停止说它有一个401,而没有发送type3身份validation消息。 有任何想法吗? 这是代码 – Authenticator.setDefault(new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(“username”, “password”.toCharArray()); } }); URL url = new URL(“https://service_url.svc”); // Proxy for fiddler Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(“localhost”, 8888)); // Create a connection HttpURLConnection conn = (HttpURLConnection)url.openConnection(proxy); conn.setRequestMethod(“GET”); conn.setDoInput(true); conn.setDoOutput(true); conn.setUseCaches(false); InputStream is = conn.getInputStream(); BufferedReader […]

使用Spring Rest Template时,HttpConnection的默认保持活动时间

我想知道在通过Spring rest Template创建新连接之前,HttpConnection在不活动时保持活动多长时间。 我查看了默认的连接超时和读取超时参数,但我相信这些是在由于某些故障等原因未建立连接时在连接超时的上下文中使用的。 我正在寻找的是,如果没有活动(或)不活动,连接保持多长时间,以及如何通过Spring Rest Template(或)底层机制来配置它。

java httpurlconnection切断html

嘿,我正试图从推特个人资料页面获取html,但httpurlconnection只返回一小段html。 我的代码 for(int i = 0; i < urls.size(); i++) { URL url = new URL(urls.get(i)); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestProperty("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6"); System.out.println(connection.getResponseCode()); String line; StringBuilder builder = new StringBuilder(); BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); while((line = reader.readLine()) != null) { builder.append(line); } String html […]

Java HttpURLConnection InputStream.close()挂起(或工作时间太长?)

首先,一些背景。 有一个工作人员扩展/解决了一堆短URL: http://t.co/example -> http://example.com 所以,我们只是按照重定向。 而已。 我们不会从连接中读取任何数据。 在我们得到200之后,我们返回最终的URL并关闭InputStream。 现在,问题本身。 在生产服务器上,其中一个解析程序线程挂起在InputStream.close()调用内: “ProcessShortUrlTask” prio=10 tid=0x00007f8810119000 nid=0x402b runnable [0x00007f882b044000] java.lang.Thread.State: RUNNABLE at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) at java.io.BufferedInputStream.skip(BufferedInputStream.java:352) – locked (a java.io.BufferedInputStream) at sun.net.www.MeteredStream.skip(MeteredStream.java:134) – locked (a sun.net.www.http.KeepAliveStream) at sun.net.www.http.KeepAliveStream.close(KeepAliveStream.java:76) at java.io.FilterInputStream.close(FilterInputStream.java:155) at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.close(HttpURLConnection.java:2735) at ru.twitter.times.http.URLProcessor.resolve(URLProcessor.java:131) at ru.twitter.times.http.URLProcessor.resolve(URLProcessor.java:55) at … 经过简单的研究,我了解到在调用skip()之前将其清理回连接池(如果设置了keep-alive?)。 我仍然不明白如何避免这种情况。 此外,我怀疑我们的代码中是否存在一些不良设计或JDK中存在问题。 所以,问题是: 是否可以避免挂在close() ? 例如,保证一些合理的超时。 是否可以避免从连接中读取数据? 记住我只想要最终的URL。 实际上,我认为,我根本不想调用skip() […]