URLConnections
URLConnection
is an abstract class that represents an active connection to a resource specified by a URL. The URLConnection
class has two different but related purposes. First, it provides more control over the interaction with a server (especially an HTTP server) than the URL
class. With a URLConnection
, you can inspect the header sent by the server and respond accordingly. You can set the header fields used in the client request. You can use a URLConnection
to download binary files. Finally, a URLConnection
lets you send data back to a web server with POST or PUT and use other HTTP request methods. We will explore all of these techniques in this chapter. Second, the URLConnection
class is part of Java's protocol handler mechanism, which also includes the URLStreamHandler
class. The idea behind protocol handlers is simple: they separate the details of processing a protocol from processing particular data types, providing user interfaces, and doing the other work that a monolithic web browser performs. The base java.net.URLConnection
class is abstract; to implement a specific protocol, you write a subclass. These subclasses can be loaded at runtime by apps. For example, if the browser runs across a URL with a strange scheme, such as compress, rather than throwing up its hands and issuing an error message, it can download a protocol handler for this unknown protocol and use it to communicate with the server. Writing protocol handlers is the subject of the next chapter. Only abstract URLConnection
classes are present in the java.net
package. The concrete subclasses are hidden inside the sun.net
package hierarchy. Many of the methods and fields as well as the single constructor in the URLConnection
class are protected. In other words, they can only be accessed by instances of the URLConnection
class or its subclasses. It is rare to instantiate URLConnection
objects directly in your source code; instead, the runtime environment creates these objects as needed, depending on the protocol in use. The class (which is unknown at compile time) is then instantiated using the forName()
and newInstance( )
methods of the java.lang.Class
class.
URLConnection
does not have the best-designed API in the Java class library. Since the URLConnection
class itself relies on the Socket
class for network connectivity, there's little you can do with URLConnection
that can't also be done with Socket
. The URLConnection
class is supposed to provide an easier-to-use, higher-level abstraction for network connections than Socket
. In practice, however, most programmers have chosen to ignore it and simply use the Socket
class. One of several problems is that the URLConnection
class is too closely tied to the HTTP protocol. For instance, it assumes that each file transferred is preceded by a MIME header or something very much like one. However, most classic protocols such as FTP and SMTP don't use MIME headers. Another problem, one I hope to alleviate in this chapter, is that the URLConnection
class is extremely poorly documented, so very few programmers understand how it's really supposed to work.