HttpURLConnection是Java提供用于支持HTTP协议的网络访问,用它访问一个URL的内容很方便。但是最近遇到一个问题,就是用它发送POST请求的时候总是返回502错误:Bad Gateway;但是同样的代码,同样的IDE,同样的JDK,同样的系统环境,用Apache的开源HttpClient发出同样的POST请求却是正常返回200;更诡异的是使用JDK1.6.0-14版本一切正常,返回200,但用JDK1.6.0-20/24的时候却返回了502。起初怀疑JDK出了bug,不过后来事实证明,只要你怀疑一个大的系统出了问题的时候,十有八九问题都是出在自身,只有很少的概率才出现那种状况。
除了怀疑JDK的问题以外,还觉得是HttpURLConnection类使用不当。Google了好久,现在整理一个HttpURLConnection的使用方法如下:
对于http的POST和PUT请求,发出HTTP请求应该遵循的步骤:
- 生成HttpURLConnection实例,并设置http请求参数或者属性;
- 调用getOutputStream方法获得OutputStream并且输出数据到输出流。不管你有没有数据需要发送到服务器端,至少你要调用一下getOutputStream()方法之后忽略数据的写入;
- 调用getInputStream方法发出真实的http请求,并且等待服务器的响应。不管你需不需要服务器的反馈,这个必须调用。
对于http的除了POST和PUT的其他请求(如GET,HEAD,DELETE,TRACE,OPTIONS),发出HTTP请求应该遵循的步骤:
- 生成HttpURLConnection实例,并设置http请求参数或者属性;
- 调用getInputStream方法发出真实的http请求,并且等待服务器的响应。
我们不能假定调用getOutputStream()获得OutputStream,写入数据,然后调用输出流的flush()/close()方法就把真实的http请求发送到服务器端了。事实上,调用HttpURLConnection的getInputStream()方法是唯一的发出真实请求的方法,而调用getOutputStream()方法并没有发送真实的Http请求。
除此之外,使用HttpURLConnection的时候一定要根据请求的类型(POST,GET等)去遵循上面描述的执行顺序,比如说你已经调用共getInputStream()方法了,你在调用getOutputStream()方法的时候就抛异常了,HttpURLConnection说这是不合法的。
我遇到的诡异的问题就是发出POST请求的时候没有调用getOutputStream()方法,省略了POST/PUT请求执行顺序中的第2步导致的。同样的,如果在GET请求中调用的getOutputStream(),JDK的代码显示这个请求就自动变成POST请求了,为了向后兼容的原因也不告诉你,不抛异常。而非POST或PUT请求则直接抛异常了。从代码中也可以看出使用POST或者PUT,或者在GET请求中调用getOutputStream()是一定要设置setDOOutput(true);
- public synchronized OutputStream getOutputStream() throws IOException {
- if (!doOutput) {
- throw new ProtocolException(
- "cannot write to a URLConnection" + " if doOutput=false - call setDoOutput(true)");
- }
- if (method.equals("GET")) {
- method = "POST"; // Backward compatibility
- }
- if (!"POST".equals(method) && !"PUT".equals(method) && "http".equals(url.getProtocol())) {
- throw new ProtocolException("HTTP method " + method
- + " doesn't support output");
- }
- }
- //.......
- }
这时候我们可以看出Java那些个以提高可读性为目的的冗长的方法名,变量名这时候变成了一种误导。还有一个问题就是JDK 1.6.0不同版本之间的行为不一致的问题,原因还是未知。
相关推荐
《Java网络编程(第4版)》是一本深入探讨Java平台上的网络编程技术的专业书籍,适合想要提升Java通讯技术的学者阅读。此书全面覆盖了Java网络编程的基础和高级概念,帮助开发者理解如何利用Java语言构建高效、可靠的...
Java网络编程是计算机科学中的一个重要领域,特别是在软件开发中,它涉及到如何通过网络进行数据传输和通信。在Java中,网络编程主要依赖于Java的Socket编程、ServerSocket、URL类以及NIO(非阻塞I/O)等核心API。这...
《Java网络编程精解》是孙卫琴老师的一本经典教程,主要涵盖了Java语言在网络编程领域的深度解析。这本书深入浅出地介绍了如何使用Java进行网络通信,包括基本的TCP/IP协议、套接字编程、多线程技术以及HTTP、FTP等...
Java网络编程是开发分布式应用程序的关键技术,它允许程序通过网络发送和接收数据。《Java网络编程实例》这本书的源代码...同时,学习时结合书中的理论知识,理论与实践相结合,将使你的Java网络编程能力更上一层楼。
《JAVA网络编程大全》是一本全面且深入介绍Java网络编程技术的权威著作,旨在帮助读者掌握Java在构建网络应用程序中的核心概念和实践技巧。PDF版的书籍为学习者提供了便捷的电子阅读体验,随时随地都能深化对Java...
这份《java网络编程》的电子课件,显然是为了帮助开发者深入理解和掌握这些核心概念而设计的。 首先,我们需要理解Java在网络编程中的基础——Socket编程。Java的Socket类提供了客户端与服务器端通信的基本接口,它...
本资源为"Java网络编程.chm",是一本关于Java网络编程的电子书,以实例驱动的方式深入讲解了相关知识。 首先,我们要理解Java在网络编程中的基础——IO流。Java中的IO流分为字节流和字符流,它们用于读写数据,包括...
Java网络编程是Java开发中的重要领域,它涵盖了网络通信的所有基本概念和技术,使得Java应用程序能够通过网络进行数据传输和交互。在本节中,我们将深入探讨Java网络编程的关键知识点,包括套接字(Socket)编程、多...
首先,我们要了解Java网络编程的基础,这通常从理解网络通信的基本原理开始。TCP/IP协议是互联网通信的核心,Java通过内置的Socket类提供了对TCP/IP协议的支持。TCP是一种面向连接的、可靠的传输层协议,而IP则负责...
Java网络编程是Java开发中的重要领域,它涵盖了通过网络连接进行数据传输和通信的各种技术和方法。本教程将深入探讨如何利用Java进行高效且可靠的网络编程。 一、Java网络编程基础 Java提供了丰富的API来支持网络...
Java网络编程是Java开发中的重要领域,它涵盖了网络通信的所有基本概念和技术,包括TCP/IP协议栈、套接字(Socket)编程、多线程、数据传输格式等。孙卫琴的《java网络编程》一书深入浅出地讲解了这些核心概念,并...
Java网络编程是Java开发中的重要领域,它涵盖了网络通信的所有基本概念和技术,使得Java应用程序能够通过网络进行数据传输和交互。本视频教程旨在为学习者提供一个全面且深入的Java网络编程指南,无论你是初学者还是...
学习过程中,通过阅读《Java网络编程学习资料》这本书,你可以了解到如何创建简单的服务器和客户端示例,理解Socket通信的过程,以及如何利用JTA进行分布式事务管理。书中可能还包含了一些实用的代码示例和最佳实践...
Java网络编程是Java开发中的重要领域,特别是在构建分布式系统、客户端-服务器应用或者网络服务时。这个"java网络编程实例2"很可能包含了深入的实践案例,帮助读者理解并掌握网络编程的基本概念和技术。以下是根据...
在Java编程中,HTTPURLConnection是Java标准库提供的一种用于处理HTTP连接的类,它允许我们发送HTTP请求并接收响应。然而,HTTP协议本身是无状态的,这意味着每次请求都是独立的,不会记住之前的交互,这对于需要...
Java网络编程是Java开发中的重要领域,它涵盖了网络通信的所有基本概念和技术,使得Java应用程序能够通过互联网进行数据传输和交互。本教程详细介绍了这一主题,旨在帮助初学者和有一定经验的开发者深入理解Java网络...
8. **实战演练**:“Java网络编程实例4”很可能包含了一系列的实战项目,通过这些实例,你可以深入理解并应用上述理论知识,解决实际问题,提高编程技能。 这个压缩包中很可能包含了详细的教学材料,包括源代码、...
《JAVA网络编程(源代码)》是一份涵盖了网络编程各个方面的资源集合,它包含了大量实例,旨在帮助开发者深入理解和实践JAVA在网络编程中的应用。这些源代码实例覆盖了网络通信的基础到高级主题,对于想要提升JAVA...
《Java网络编程(第二版)》是一本深入探讨Java在互联网环境下的编程技术的专业书籍。本书全面覆盖了Java网络编程的基础知识和高级技巧,旨在帮助读者掌握如何利用Java语言进行网络应用开发。以下是对其中主要知识点...
《Java网络编程》第三版是由Elliotte Rusty Harold编著的一本专业书籍,中文版为国内Java开发者提供了深入理解网络编程的宝贵资源。这本书详细介绍了如何使用Java语言进行网络应用开发,涵盖了从基础概念到高级技术...