URLConnection(Java网络编程)

URLConnection

  • URLConnection是一个抽象类,表示指向URL指定资源的活动连接。
  • URLConnection对与服务器的交互提供了比URL类更多的控制。通过URLConnection,可以查看服务器发送的首部,进行相应的响应。可以设置客户端请求的首部字段。可以下载二进制文件。
  • URLConnection允许通过POST或PUT将数据发送给服务器,或使用其他HTTP请求方法。

打开URLConnection

直接使用URLConnection的基本步骤:

  1. 构造一个URL对象
  2. 调用URL对象的openConnection()获取一个对应该URL的URLConnection对象
  3. 配置URLConnection
  4. 读取首部字段
  5. 获得输入流读取数据
  6. 获得输出流写入数据
  7. 关闭连接

读取服务器的数据

使用URLConnection对象获取URL数据的基本步骤:

  1. 构造一个URL对象
  2. 调用URL对象的openConnection()获取一个对应该URL的URLConnection对象
  3. 调用URLConnection的getInputStream()方法
  4. 使用正常的流API读取输入流

读取首部

获取指定的首部字段

  • getContentType():提取其中的charset,设置正确的编码格式
  • getContentLength():告知内容中有多少字节。许多服务器只在传输二进制文件时才发送content-length首部,在传送文本文件时不发送。如果需要知道要读取的具体字节,或者需要预先创建足够大的缓冲区来保存数据时,就可以使用这个方法。
  • getContentEncoding():返回一个string,告知内容是如何编码的(不是字符编码方式)
  • getDate():告知文档是何时发送的(相对于服务器时间)
  • getExpiration():返回基于服务器的过期时间,指示应当何时从缓存中删除文档,并重新从服务器下载。
  • getLastModified():返回文档最后修改日期

获得任意首部字段

  • getHeaderField(String name):返回指定首部字段的值。如:String contentType=uc.getHeaderField(“content-type”); 不要假定返回的值是有效的。必须进行检查以确保它不是空的。
  • getHeaderFieldKey(int n):返回第n个首部字段的键
  • getHeaderField(int n):返回第n个首部字段

配置连接

  • URLConnection类有7个保护类型的实例字段,定义了客户端如何向服务器做出请求。只能在URLConnection连接前修改这些字段。如果调用设置这些字段的方法时连接已经打开,大多数方法会抛出一个IlegalStateException异常。
  • protected URL url:制定了URLConnection连接的URL。构造函数会在创建URLConnection时设置它,此后就不能再改变。可以使用getURL()方法获取它的值。
  • protected boolean connected:这个变量只能由java.net.URLConnection及其子类的实例访问。没有直接读取或改变connected值的方法。
  • protected boolean allowUserInteraction:可以读取和设置是否允许与用户交互。
  • protected boolean doInput:在可用于输入时为true,否则为false。默认值是true。
  • protected boolean doOutput:用于输出。默认为false。当设置doOutput为true时,请求方法就由GET改为POST。
  • protected boolean ifModifiedSince:询问服务器文档是否在特定时间后修改过。如果修改过,服务器就会发送文档。如果没有,文档可以直接从之前的缓存中获取。可以在请求中加入一行:If-Modified-Since: Sun, 31 Oct 2004 19:22:07 GMT 如果文档在此期间修改过,服务器就会像平常一样发送文档。否则,回复一个304(Not Modified)。
  • protected boolean useCaches:确定是否可以在缓存可用时使用缓存。默认值为true。

超时

  • setConnectTimeout()/getConnectTimeout()控制socket等待建立连接的时间。
  • setReadTimeout()/getReadTimeout()控制输入流等待数据到达的时间。
  • 这些方法都以毫秒为单位度量时间。都将0解释为永远不超时。如果超时值为负数,会抛出IllegalArgumentException异常。

配置客户端的请求HTTP首部

  • 可以使用setRequestProperty根据指定名和值增加一个字段,添加HTTP首部。但为相同特性设置新值时,会改变现有的特性值。为增加额外的特性值,要使用addRequestProperty()。
  • 也可以使用getRequsetProperty()获取URLConnection的首部。

向服务器写入数据

  • 有时需要向URLConnection写入数据,例如使用POST向服务器提交表单,或使用PUT上传文件时。getOutputStream()方法返回一个OutputStream,可以用来写入数据并传送给服务器。
  • 由于URLConnection在默认情况下不允许输出,所以必须在请求输出流前调用setDoOutput为true。
  • 一旦得到了OutputStream,就将其链接到BufferedOutputStream或BufferedWriter进行缓冲。一般还应当链接到DataOutputStream、OutputStreamWriter或其他比OutputStream易于使用的类。
  • 调用setDoOutput(true),使用URLConnection的getOutputStream()方法写入查询字符串,而不是附加到URL上(有些服务器会限制URL长度)。Java会缓冲所有写入输出流的数据,直到流被关闭为止。(不要忘记关闭流!)

内容处理器

  • 内容处理器只处理实际的数据。它接收去掉所有首部等等之后的原始输入,转换为Java能处理的实际类型对象,如InputStream或ImageProducer。
  • 使用URLConnection的getContent()方法使用内容处理器将连接的原始数据转换为一个Java对象。这个方法本质上与URL类的getContent()方法相同。事实上,URL类的getContent()方法就只是调用了这个方法。
  • getContent()方法只用于类似HTTP的协议,这种协议对MIME内容类型有清楚的了解。如果内容类型未知,或协议无法理解内容类型,getContent()就会抛出一个UnknownServiceException异常。
  • getContent(Class[] classes)方法可以选择将内容转换为哪个类,已提供数据的不同对象表示。这个方法尝试以classes数组中某个类的形式返回内容。优先顺序就是数组的顺序。例如:Class[] types={String.class,Reader.class,InputStream.class}; Object o=uc.getContent(types); 然后使用instanceOf检测返回对象的类型,分别处理。

猜测MIME内容类型

  • MIME出现之前已有的旧协议,如FTP,没有指定传输文件的类型。而且有许多应当使用MIME的HTTP服务器也根本不提供MIME首部,或者提供了不正确的首部。URLConnection类提供了两个静态方法,可以帮助程序指出某些数据的MIME类型;如果内容类型不可用或有理由相信得到的内容类型不正确时,就可以使用这些方法。
  • URLConnection.guessContentTypeFromName():尝试根据对象URL的扩展文件名部分猜测对象的内容类型。猜测结果会作为String返回。
  • URLConnection.guessContentTypeFromStream():尝试通过流中前几个字节来猜测内容类型。但这个方法的猜测结果没有guessContentTypeFromName()的结果可靠。

HttpURLConnection

  • HttpURLConnection是URLConnection类的抽象子类,它提供了一些有助于专门操作http URL的额外方法:可以获得和设置请求方法、确定是否跟踪转发、获得响应码及消息,以及指出是否使用了代理服务器。
  • 由于这个类是抽象子类,唯一的构造函数是保护类型的,不能直接创建实例。但调用URL对象的openConnection()方法返回的URLConnection就是HttpURLConnection的一个实例。可以直接把URLConnection转换为HttpURLConnection。

请求方法

  • 当Web客户端联系服务器时,发送的第一行信息就是请求行。一般情况下,以GET开始,后面是客户端希望获取的文件名和客户端理解的HTTP协议版本,如:GET /catalog/index.html HTTP/1.0
  • HttpURLConnection默认使用GET方法。可以使用setRequestMethod()方法修改。这个方法的参数应该是以下七个字符串之一(区分大小写):GET、POST、HEAD、PUT、OPTIONS、DELETE、TRACE。如果使用其他方法,就会抛出java.net.ProtocolException异常。
  • HEAD:请求服务器返回HTPP首部,不用实际发送文件。这个方法最常见的用法是检查文件是否在最后缓存之后有所修改。
  • OPTIONS:查询对某个URL支持哪些选项。如果请求的URL是星号(*),则请求将应用于整个服务器而不是某个URL。服务器会发送对应URL所允许的命令列表。
  • DELETE:删除Web服务器上位于指定URL的文件。这个请求一般不支持,或者需要身份认证。
  • PUT:上传文件。大多数服务器不包括对PUT直接的完整支持。
  • TRACE:发送服务器从客户端接受的HTTP首部。之所以使用这个信息,是为了查看服务器和客户端之间的代理服务器会对HTTP首部进行怎样的修改。

处理服务器响应

  • HTTP服务器响应的第一行包括一个数字码和一个指示进行何种响应的消息。最常见的响应是200 OK。
  • 响应的第一行成为响应消息(response message)。它不会由URLConnection的getHeaderField()方法返回。而是要调用HttpURLConnection的getResponseMessage()。 HttpURLConnection的getResponseCode()方法可以返回响应码。

重定向

  • 300一级的响应码都表示某种重定向;即请求的资源在所期望的位置上不再可用,但可能会在其他位置上找到。当遇到这样的响应时,大多数浏览器会自动加载新位置的文档。但这存在一个安全风险,因为它会潜在地将用户从可信任网站移到不可信任网站,甚至用户可能都没有察觉。
  • 默认情况下,HttpURLConnection会跟随重定向。可以用getFollowRedirects()和setFollowRedirects()确定是否跟随重定向。如果安全管理器不允许改变,则会抛出一个SecurityException异常。
  • Java有两个基于实例配置重定向的方法:getInstanceFollowRedirects()和setInstanceFollowRedirects()。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值