导语

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. docker4dotnet #5 使用VSTS/TFS搭建基于容器的持续交付管道

    在过去的几篇d4d系列中,我给大家介绍了如何使用docker来支持asp.net core的应用开发,打包的场景.Asp.net core的跨平台开发能力为.net开发人员提供了使用容器进行应用开发的 ...

  2. C#基础知识六之委托(delegate、Action、Func、predicate)

    1. 什么是委托 官方解释 委托是定义方法签名的类型,当实例化委托时,您可以将其实例化与任何具有兼容签名的方法想关联,可以通过委托实例调用方法. 个人理解 委托通俗一点说就是把一件事情交给别人来帮助完 ...

  3. 在DevExpress程序中使用内置的图标构建美观的界面元素

    在我们一般的程序中,为一般的界面元素添加一定的图标展示,有助于提升界面的整体的美观.结合排版布局,以及固定场景的图标,往往给用户非常好的直观感受:统一.美观.易理解.因此在一般的程序界面中,都尽量在略 ...

  4. Razor 语法初级使用,不断更新此文章

    有兴趣的可以看看菜鸟教程的   http://www.runoob.com/aspnet/razor-cs-loops.html 1.ViewData展示登陆的Session信息 Controller ...

  5. 《连载 | 物联网框架ServerSuperIO教程》- 13.自定义视图显示接口开发,满足不同的显示需求

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  6. 9.1.3 .net framework通过业务逻辑层自动生成WebApi的做法

    首先需要说明的是这是.net framework的一个组件,而不是针对.net core的.目前工作比较忙,因此.net core的转换正在编写过程中,有了实现会第一时间贴出来. 接下来进入正题.对于 ...

  7. SAP CRM 通过调试观察CL_CRM_BOL_ENTITY中的数据

    这个(BOL里面)最重要的类值得一看. BOL中的每条记录都会在CL_CRM_BOL_ENTIT中表示.至今,我们已经写过一些事件处理器,并且我们已经直接或间接的通过这个类工作.在业务场景中,我们也许 ...

  8. Linux下安装JDK和Eclipse

    安装步骤: (1)下载JDK (jdk-8u20-linux-x64.tar.gz) (2)卸载系统自带的开源JDK  rpm  -qa |grep  java rpm  –e   java  (3) ...

  9. ArcGIS Engine开发之属性查询

    属性查询即基于空间数据的属性数据的查询,通过用户提交SQL语言中的where语句定义的查询条件,对属性数据进行搜索,从而得到查询结果的操作. 相关的类与接口 与属性查询功能相关的类主要有QureyFi ...

  10. 将语音搜索集成到Google Now中

    原文标题:Use Voice Search to integrate with Google Now 原文链接:http://antonioleiva.com/voice_search_google_ ...