从上图,可知HttpURLConnection是URLConnection类的子类,先了解下URLConnection.
URLConnection类:
描述:
是从Url创建的,并且用于访问URL指向的资源的通信连接。
这个抽象类的工作是通过底层协议(例如http或者https)来处理。
URLConnection是应用程序和Url之间通信的类的超类。
这类对象可以读取和写入Url所指向的资源。
从URL创建其对象到读写URL指向的资源,进行了以下步骤:
通过URL调用openConnection()来创建对象
设置一般参数和请求属性
connection()来实际连接到远程对象
若是远程对象可用,则可以访问远程对象的Header( 标头)和content(内容)
对以上4个步骤,详细描述如下:
创建方式:
url.openConnection();
修改参数的方法:
setAllowUserInteraction() setDoInput() setDoOutput() setIfModifiedSince() setUseCaches()
修改Request的属性的方法:
setRequestProperty()
总结:以上每个set()都有对应的get()获取到对应值。设置哪些参数和request的属性都是协议指定的。
设置一些默认配置的方法:
setDefaultAllowUserInteraction setDefaultUseCaches.
在连接远程对象后(即调用connection()),用于获取内容和header的方法:
getContent getOutputStream getHeaderField getInputStream
一些频繁访问header的方法:
getContentEncoding getContentLength getContentType getDate getExpiration getLastModifed
释放相关的网络资源:
调用getInputStream()或getOutputStream(),需再调用close()。
通常情况下,可以忽略预连接的参数和一般请求属性(简单理解:使用 get请求,不设置参数,request 属性)。
对于大多数客户端(使用者):需注意这两个getInputStream() 和getContent()。它们很方便访问到Url所指向的资源(简单理解:通过这两个方法可以读取到服务器上的数据)。
其API:
addRequestProperty(String key, String value) : 添加一个key-value形式的Request属性
connect():若是url的通信连接,将打开到此Url所指向资源的通信连接。
setRequestProperty(String key, String value):设置request 的属性
setUseCaches(boolean usecaches):设置true,允许协议使用缓存
setReadTimeout(int timeout) : 将读超时设置为指定的超时值,以毫秒为单位。
setIfModifiedSince(long ifmodifiedsince):设置从第几个对象开始获取(有些协议支持跳过对象获取)
setFileNameMap(FileNameMap map): 设置 FileNameMap。
setDoOutput(boolean dooutput): 设置true,允许添加数据。post请求需要用到
setDoInput(boolean doinput): 设置true,允许从服务器读取数据
setAllowUserInteraction(boolean allowuserinteraction):设置true,允许用户交互的上下文对此Url进行操作。(设置为true,服务器可以获取request中coockie.loaction等等)
setConnectTimeout(int timeout): 设置一个指定的超时值(以毫秒为单位)
setContentHandlerFactory(ContentHandlerFactory fac): 设置应用程序的 ContentHandlerFactory。
- getxxx()与setxxx()相对应:这里省略
官方链接: http://docs.oracle.com/javase/8/docs/api/java/net/URLConnection.html
中文翻译的链接:http://www.apihome.cn/api/java/URLConnection.html
HttpURLConnection类:
描述:
一个URLConnection子类,提供一些特有附加功能对于Http协议。
每个HttpURLConnection对象是用于单个请求,但可以与其他HttpURLConnection对象共享Http服务器的底层网络连接。
对于共享的网络连接,在HttpURLConnection的InputStream (或者 OutputStream)调用close()来释放网络资源是没有效果的。
若是不需要连接服务器,则调用disconnect() 来关闭底层的socket,释放资源.
htttp协议处理一些访问系统数据的设置。例如代理设置及各种其他设置
其特有的API(除开继承父类的外):
disconnect(): 解除连接
getPermission():返回一个权限对象,其代表建立此对象表示的连接所需的权限。
setRequestMethod(String method):设置请求方式,例如GET POST HEAD OPTIONS PUT DELETE TRACE
getRequestMethod():获取request的请求方式
usingProxy():使用代理模式连接
getErrorStream() :获取到错误流
getFollowRedirects() :自动执行Http重定向的boolean值
getHeaderField(int n) :返回第n个header的值
getHeaderFieldKey(int n) :获取第n个headder的key
getHeaderFieldDate(String name, long Default) :返回解析为日期的指定字段的值。
getResponseCode() :获取状态码
getResponseMessage():获取与来自服务器的响应代码一起返回的 HTTP 响应消息(如果有)。
setChunkedStreamingMode(int chunklen) :在不知道内容长度前提下,设置流输出时的存储块长度
setFixedLengthStreamingMode(int contentLength) :在知道内容长度前提下,设置流输出的固定内容长度
setFollowRedirects(boolean set):设置true,允许自动执行Http重定向
setInstanceFollowRedirects(boolean followRedirects) :设置此 HttpURLConnection 实例是否应该自动执行 HTTP 重定向(响应代码为 3xx 的请求)。
官方链接:http://docs.oracle.com/javase/8/docs/api/java/net/HttpURLConnection.html
中文连接:http://www.apihome.cn/api/java/HttpURLConnection.html
使用案例 :
GET使用方式:
先创建HttpURLConnection对象,设置Header( 标头 ):/** * 创建httpUrlConnection对象,指定request的属性 * * @param url * @return */ public HttpURLConnection createConnection(String url) { HttpURLConnection urlConnection = null; try { //创建其对象 urlConnection = (HttpURLConnection) new URL(url).openConnection(); //设置连接时间,10秒 urlConnection.setConnectTimeout(10 * 1000); urlConnection.setReadTimeout(10 * 1000); //数据编码格式,这里utf-8 urlConnection.setRequestProperty("Charset", "utf-8"); //添加cookie,cookie规则需开发者自定 urlConnection.setRequestProperty("Cookie", Constants.COOCKIE_KEY + token); //设置返回结果的类型,这里是json urlConnection.setRequestProperty("accept", "application/json"); //这里设置post传递的内容类型,这里json urlConnection.setRequestProperty("Content-Type", "application/json"); } catch (Exception e) { e.printStackTrace(); } return urlConnection; }
从服务器响应数据,获取其内容转成String类型的数据:
/** * 获取HttpUrlConnection的返回内容 * * @param urlConnection * @return */ public String getStreamContent(HttpURLConnection urlConnection) { ByteArrayOutputStream byteArrayOutputStream = null; BufferedInputStream bufferedInputStream = null; String result = null; try { //开启客户端与Url所指向的资源的网络连接 urlConnection.connect(); if (200 == urlConnection.getResponseCode()) {//HTTP_OK 即200,连接成功的状态码 if (urlConnection.getContentLength() > 0) { bufferedInputStream = new BufferedInputStream(urlConnection.getInputStream()); byteArrayOutputStream = new ByteArrayOutputStream(); //httpUrlConnection返回传输字节的长度,创建一个byte 数组。 byte[] b = new byte[urlConnection.getContentLength()]; int length; while ((length = bufferedInputStream.read(b)) > 0) { byteArrayOutputStream.write(b, 0, length); } result = byteArrayOutputStream.toString("utf-8"); } } } catch (Exception e) { e.printStackTrace(); } finally { try { if (byteArrayOutputStream != null) { byteArrayOutputStream.close(); } if(bufferedInputStream!=null){ bufferedInputStream.close(); } if (urlConnection != null) { //解除连接,释放网络资源 urlConnection.disconnect(); } } catch (Exception e) { e.printStackTrace(); } } return result; }
POST使用方式:
Post请求方式是需要添加Body的,需要传递数据到服务器的。创建其对象和读取服务器返回数据的操作都一样,比GET请求方式多一步添加数据操作: 这里传递一个json数据类型的数据//设置连接配置 HttpURLConnection httpURLConnection = createConnection(url2); //添加传递的参数 ddParameter(httpURLConnection, jsonObject); //获取返回数据 String result = getStreamContent(httpURLConnection); /** * 添加http参数 * * @param urlConnection * @param jsonObject */ public void addParameter(HttpURLConnection urlConnection, JSONObject jsonObject) { try { //设置post请求方式 urlConnection.setRequestMethod("POST"); //允许往流中写入数据 urlConnection.setDoOutput(true); //借助BufferedOutputStream提高速度 OutputStream outputStream = new BufferedOutputStream(urlConnection.getOutputStream()); byte[] body = jsonObject.toString().getBytes("utf-8"); outputStream.write(body, 0, body.length); //刷新数据到流中 outputStream.flush(); //关闭流 outputStream.close(); } catch (Exception e) { e.printStackTrace(); } }
衍生点:
HTTP请求是有Header和Body构成,Body是传递到服务器上的数据(Post会用到),Header是标头,包 含一些Coockie,传递的数据的编码格式,响应的数据的编码格式,Accept格式,Keep-Alive等等。这里是一个简单的Request Header包含的信息:
Host localhost:8080 Accept text/html,application/xhtml+xml,application/xml;q=0.9 Accept-Language fr,en-gb;q=0.7,en;q=0.3 Accept-Encoding gzip,deflate Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive 300