导语

java.net.HttpURLConnectin类是URLConnection类的抽象子类。它在处理协议为HTTP的URL时特别有效。具体而言,它通过它可以获取和设置请求方法,确定是否重定向,获取响应码和消息体,以及是否使用代理。由于这个类是一个抽象类,所以不能直接创建它的实例。不过可以通过强转的方式来获取 HttpURLConnection对象。

获取一个HttpURLConnection对象
URL url = new URL("http://www.xdysite.cn/index.php");
HttpURLConnection http = (HttpURLConnection) url.openConnection();

请求方法

HTTP请求中的常用方法包含一下几个

  • GET
  • POST
  • HEAD
  • PUT
  • DELETE

HEAD

HEAD方法是最简单的方法。这个方法和GET方法很类似。不过,它告诉服务器只返回HTTP首部,不用实际发送消息体。这个方法最常见的用途是检查当前客户端缓存的文件是否与服务器一致(服务器可能会对文件做修改操作)。下面是个使用HEAD请求方法的简单程序,它会显示服务器中一个文件最后一次修改时间。

public static void main(String[] args) throws MalformedURLException {
URL url = new URL("http://www.xdysite.cn/index.html");
try {
HttpURLConnection http = (HttpURLConnection) url.openConnection();
http.setRequestMethod("HEAD");
System.out.println("该资源最后一次修改时间"+ new Date(http.getLastModified()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

执行结果

服务器资源

http://cgblb.img48.wal8.com/img48/563395_20161212173407/s/148163323406_medium.jpg

这里并不一定非要使用HEAD方法,也可以利用GET来得到同样的结果。不过使用GET方式的话,服务器会发送该资源。而我们只关心首部中的文件的最后修改时间而已。

DELETE

DELETE方法将删除Web服务器上位于指定URL的文件。由于这个请求存在明显的安全风险,所以并非所有的服务器都配置支持这个方法,即使支持该方法通常也需要进行身份认证。典型的请求方式如下:

DELETE /javafaq/2016march.html HTTP/1.1
Host: www.xdysite.cn
Accept: text/html,image/gif,image/jpeg,*;q=0.2
Connection: keep-alive

如果服务器接受这个请求,其响应也与实现有关。有的服务器会删除文件,有的则会将文件放到回收站中。另外一些则只是将这个文件标记为不可读。

PUT

如果我们需要将文件放到Web服务器上,则可以采用该方法。这个方法允许客户端放在网站的抽象层次结构中,而不需要知道网站是如何映射到具体的本地文件系统的。这与FTP正相反,FTP用户必须知道实际的目录结构,而不是服务器的虚拟目录结构。下面显示如何利用PUT方式将一个文件放在Web服务器上

PUT /blog/wp-app.php/service/testput.html HTTP/1.1
Host: www.xdysite.cn
Content-Type: application/xml;type=entry
Content-Length: 329
If-Match: "ertr2361fgt9733" <?xml version="1.0">
<entry>
<title>The Power of Pomodoros</title>
<author><name>Elliotte Harold</name></author>
</entry>

与删除文件一样,PUT通常也需要进行某种身份认证。而大多数服务器须配置为支持PUT方式

HTTP长连接

HTTP1.1支持长连接,允许通过一个TCP socket发送多个请求和相应。在请求头和响应头中需要显示包含Connection: Keep-Alive元数据。HTTPURLConnection类透明的支持HTTP keep-alive,即默认情况下长连接是打开的。在服务器关闭连接之前,如果再次连接同一个服务器,它会重用socket。

流模式

每个发送给HTTP服务器的请求都有一个HTTP首部。首部中有一个Content-lenght字段,即请求主体中的字节数。不过,写入首部,需要知道主体的长度,但是在写首部的时候可能还不知道主体的长度。正常情况下,对于这个两难的问题,JAVA的解决办法是:对于从HTTPURLConnection获取的OutputStream,会将写入此流的所有内容进行缓存,直到流关闭。此时它就知道主体中有多少个字节了。

这种模式对于表单的短请求很合适。不过,对于非常长的表单或一些SOAP消息,相应时负担很大。因为要缓存整个数据。JAVA为这个问题提供了两个解决方案。如果知道数据的大小,则可以将数据大小告诉HTTPURLConnection对象。如果预先不知道数据大小,则可以使用分块传输方式。

public void setFixedLengthStreamingMode(long contentLength)

通过该API可以告诉HttpURLConnection数据的大小。这样JAVA就会在HTTP首部的Content-Length字段中使用这个数。不过如果最终写入的数据多于或少于这个字节数,则会抛出一个IOException。

public void setChunkedStreamingMode(int chunkLength)

在使用该API设置好块的大小后,然后我们可以通过OutputStream发送数据。每当缓存中的数据量累计到设定的值后,java就会把缓存的中的数据输出。这是数据的发送方式就是块方式(chunked)。

HttpURLConnection类的更多相关文章

  1. JDK下sun.net.www.protocol.http.HttpURLConnection类-----Http客户端实现类的实现分析

    HttpClient类是进行TCP连接的实现类, package sun.net.www.http; import java.io.*; import java.net.*; import java. ...

  2. [02] URL和HttpURLConnection类

    1.URL的概念 统一资源定位符URL(Uniform Resource Locator)是www客户机访问Internet时用来标识资源的名字和地址. URL的基本格式是: <METHOD&g ...

  3. Android基于HttpUrlConnection类的文件下载

    /** * get方法的文件下载 * <p> * 特别说明 android中的progressBar是google唯一的做了处理的可以在子线程中更新UI的控件 * * @param pat ...

  4. 安卓开发之HttpURLConnection类和Handler类的使用

    package com.lidaochen.test; import java.io.ByteArrayOutputStream; import java.io.InputStream; public ...

  5. HttpUrlConnection类基本使用

    这个类用来模拟浏览器向服务器发送请求和接收响应 注意: HttpUrlConnection对象简称huc对象 1)获取huc对象向url构造中传递url字符串,并调用openconnection方法即 ...

  6. java后台调用HttpURLConnection类模拟浏览器请求(一般用于接口调用)

    项目开发中难免遇到外部接口的调用,小生今天初次接触该类,跟着API方法走了一遍,如有不对的地方,还请哆哆指正,拜谢! 1 package com.cplatform.movie.back.test; ...

  7. HttpURLConnection类的使用

    此类以获取天气的一个api地址为例: package javaexcjs; import java.io.BufferedReader; import java.io.OutputStreamWrit ...

  8. Android的HttpUrlConnection类的GET和POST请求

    /** * get方法使用 */ private void httpGet() { new Thread() { @Override public void run() { //此处的LOGIN是请求 ...

  9. Android使用HttpURLConnection通过POST方式发送java序列化对象

    使用HttpURLConnection类不仅可以向WebService发送字符串,还可以发送序列化的java对象,实现Android手机和服务器之间的数据交互. Android端代码: public ...

随机推荐

  1. CLR via C# 摘要一:托管程序的执行模型

    托管程序的执行模型大致如下: 编译源代码为程序集(dll或exe文件),程序集包括了记录相关信息的元数据和IL代码 执行程序集文件时,启动CLR,JIT负责把IL编译为本地代码并执行 IL是微软推出的 ...

  2. 联想 Thinkpad X230 SLIC 2.1 Marker

    等了好久,终于等到了 X230 的 SLIC 2.1 的 Marker !特发帖备份... 基本情况 笔记本:Lenovo X230(i5+8G+500G) 操作系统:Windows 7 Pro x6 ...

  3. angularjs学习使用分享

    angularjs是一个为动态web应用设计的结构框架,它是为了克服html在构建应用上的不足而设计的. 工作原理: 1 加载html,然后解析成DOM: 2 加载angular.js脚本: 3 An ...

  4. C# - 多线程 之 信号系统

    基础概览 多线程之信号系统命名空间 using System.Threading; 线程同步类的继承层次关系图 终止状态和非终止状态 在终止状态下,被WaitOne()阻塞的线程会逐个得到释放.如果一 ...

  5. C#开发微信门户及应用(19)-微信企业号的消息发送(文本、图片、文件、语音、视频、图文消息等)

    我们知道,企业号主要是面向企业需求而生的,因此内部消息的交流显得非常重要,而且发送.回复消息数量应该很可观,对于大企业尤其如此,因此可以结合企业号实现内部消息的交流.企业号具有关注安全.消息无限制等特 ...

  6. quartz定时+log4net日志+exchangeservice发邮件

    main using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sys ...

  7. 节日来了发个HTML5红包

    效果图: 请关注微信公众号 何问起 , 账号ihewenqi ,或者微信扫描下图二维码: 关注后发送 愚人节 ,或 微信节日红包 ,可以体验效果. 代码如下: <!DOCTYPE html> ...

  8. JS高程5.引用类型(1)Object类型

    引用类型 在ECMASCript中,引用类型是一种数据结构,将数据和功能组织在一起,引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法.(注意:尽管ECMAScript从技术上 ...

  9. FlashBuilder4安装SVN插件步骤

    1. 选择菜单 帮助–> 安装新软件 2. 在使用里键入地址:  http://subclipse.tigris.org/update_1.6.x并点击添加 在Subclipse栏里选择带有Re ...

  10. android:使用Messenger进行进程间通信(一)

    Messenger简介 Messenger和AIDL是实现进程间通信(interprocess communication)的两种方式. 实际上,Messenger的实现其实是对AIDL的封装. Me ...