【计算机网络】详解HttpURLConnection
请求响应流程
设置连接参数的方法
- setAllowUserInteraction
- setDoInput
- setDoOutput
- setIfModifiedSince
- setUseCaches
- setDefaultAllowUserInteraction
- setDefaultUseCaches
设置请求头或响应头
HTTP请求允许一个key带多个用逗号分开的values,但是HttpURLConnection只提供了单个操作的方法:
- setRequestProperty(key,value)
- addRequestProperty(key,value)
setRequestProperty和addRequestProperty的区别就是,setRequestProperty会覆盖已经存在的key的所有values,有清零重新赋值的作用。而addRequestProperty则是在原来key的基础上继续添加其他value。
发送URL请求
建立实际连接之后,就是发送请求,把请求参数传到服务器,这就需要使用outputStream把请求参数传给服务器:
- getOutputStream
获取响应
请求发送成功之后,即可获取响应的状态码,如果成功既可以读取响应中的数据,获取这些数据的方法包括:
- getContent
- getHeaderField
- getInputStream
对于大部分请求来说,getInputStream和getContent是用的最多的。
相应的信息头用以下方法获取:
- getContentEncoding
- getContentLength
- getContentType
- getDate
- getExpiration
- getLastModifed
HttpURLConnection
任何网络连接都需要经过socket才能连接,HttpURLConnection不需要设置socket,所以,HttpURLConnection并不是底层的连接,而是在底层连接上的一个请求。这就是为什么HttpURLConneciton只是一个抽象类,自身不能被实例化的原因。HttpURLConnection只能通过URL.openConnection()方法创建具体的实例。
虽然底层的网络连接可以被多个HttpURLConnection实例共享,但每一个HttpURLConnection实例只能发送一个请求。请求结束之后,应该调用HttpURLConnection实例的InputStream或OutputStream的close()方法以释放请求的网络资源,不过这种方式对于持久化连接没用。对于持久化连接,得用disconnect()方法关闭底层连接的socket。
创建HttpURLConnection
- URL url = new URL("http://localhost:8080/xxx.do");
- URLConnection rulConnection = url.openConnection();// 此处的urlConnection对象实际上是根据URL的
- // 请求协议(此处是http)生成的URLConnection类
- // 的子类HttpURLConnection,故此处最好将其转化
- // 为HttpURLConnection类型的对象,以便用到
- // HttpURLConnection更多的API.如下:
- HttpURLConnection httpUrlConnection = (HttpURLConnection) rulConnection;
设置HttpURLConnection参数
- // 设定请求的方法为"POST",默认是GET
- httpUrlConnection.setRequestMethod("POST");
- // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在
- // http正文内,因此需要设为true, 默认情况下是false;
- httpUrlConnection.setDoOutput(true);
- // 设置是否从httpUrlConnection读入,默认情况下是true;
- httpUrlConnection.setDoInput(true);
- // Post 请求不能使用缓存
- httpUrlConnection.setUseCaches(false);
- // 设定传送的内容类型是可序列化的java对象
- // (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)
- httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object");
- // 连接,从上述url.openConnection()至此的配置必须要在connect之前完成,
- httpUrlConnection.connect();
URLConnection建立连接
- // 此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法,
- // 所以在开发中不调用上述的connect()也可以)。
- OutputStream outStrm = httpUrlConnection.getOutputStream();
- <p>getInputStream()也是同理。</p>
HttpURLConnection发送请求
- // 现在通过输出流对象构建对象输出流对象,以实现输出可序列化的对象。
- ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm);
- // 向对象输出流写出数据,这些数据将存到内存缓冲区中
- objOutputStrm.writeObject(new String("我是测试数据"));
- // 刷新对象输出流,将任何字节都写入潜在的流中(些处为ObjectOutputStream)
- objOutputStm.flush();
- // 关闭流对象。此时,不能再向对象输出流写入任何数据,先前写入的数据存在于内存缓冲区中,
- // 在调用下边的getInputStream()函数时才把准备好的http请求正式发送到服务器
- objOutputStm.close();
HttpURLConneciton获取响应
// 调用HttpURLConnection连接对象的getInputStream()函数,
InputStream inStrm = httpConn.getInputStream();
设置POST参数
- OutputStream os = httpConn.getOutputStream();
- String param = new String();
- param = "CorpID=" + CorpID +
- "&LoginName=" + LoginName+
- "&send_no=" + phoneNumber +
- "&msg=" + java.net.URLEncoder.encode(msg,"GBK"); ;
- os.write(param.getBytes());
超时设置,防止 网络异常的情况下,可能会导致程序僵死而不继续往下执行
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
System.setProperty("sun.net.client.defaultReadTimeout", "30000");
其中: sun.net.client.defaultConnectTimeout:连接主机的超时时间(单位:毫秒)
sun.net.client.defaultReadTimeout:从主机读取数据的超时时间(单位:毫秒)
JDK 1.5以前的版本,只能通过设置这两个系统属性来控制网络超时。在1.5中,还可以使用HttpURLConnection的父类URLConnection的以下两个方法:
setConnectTimeout:设置连接主机超时(单位:毫秒)
setReadTimeout:设置从主机读取数据超时(单位:毫秒)
例如:
HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();
urlCon.setConnectTimeout(30000);
urlCon.setReadTimeout(30000);
【计算机网络】详解HttpURLConnection的更多相关文章
- 详解HttpURLConnection
请求响应流程 设置连接参数的方法 setAllowUserInteraction setDoInput setDoOutput setIfModifiedSince setUseCaches setD ...
- (转)详解HttpURLConnection
请求响应流程 设置连接参数的方法 setAllowUserInteraction setDoInput setDoOutput setIfModifiedSince setUseCaches setD ...
- 计算机网络: IP地址,子网掩码,默认网关,DNS服务器详解
楔子: 以Windows系统中IP地址设置界面为参考(如图1), IP地址, 子网掩码, 默认网关 和 DNS服务器, 这些都是什么意思呢? 学习IP地址的相关知识时还会遇到网络地址,广播地址,子网等 ...
- HttpURLConnection详解
HttpURLConnection详解 07. 五 / J2EE / 没有评论 HttpURLConnection类的作用是通过HTTP协议向服务器发送请求,并可以获取服务器发回的数据. Http ...
- 计算机网络: IP地址,子网掩码,网段表示法,默认网关,DNS服务器详解
楔子: 以Windows系统中IP地址设置界面为参考(如图1), IP地址, 子网掩码, 默认网关 和 DNS服务器, 这些都是什么意思呢? 学习IP地址的相关知识时还会遇到网络地址,广播地址,子网等 ...
- 计算机网络基础之IP地址详解
计算机网络基础之IP地址详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.IP地址概述 1>.什么是IP地址 我们为什么要使用逻辑地址(IP地址)来标识网络设备,而不采 ...
- HttpUrlConnection使用详解--转AAAAA
http://hc.apache.org/httpclient-3.x/apidocs/org/apache/commons/httpclient/HttpConnection.html HttpUr ...
- 计算机网络(12)-----HTTP协议详解
HTTP协议详解 http请求 http请求由三部分组成,分别是:请求行.消息报头.请求正文 (1)请求行 请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Metho ...
- 计算机网络(六),UDP报文段详解
目录 1.UDP作用 2.UDP报文段详解 六.UDP报文段详解 1.UDP作用 (1)面向非连接 (2)不维护连接状态,支持同时向多个客户端传送相同的消息 (3)报文段报头只有8个字节,格外开销较小 ...
随机推荐
- JS和JQuery的比较
一. Jquery它是javascript的一个轻量级框架,是对javascript进行封装. 二.JQuery和JS都有加载函数,但表达方式不同. 1.JS中的加载函数: //整个文档加载完毕后执行 ...
- C#中base的作用
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- .Net Core 项目引用本地类库方式(一)
最近了解到.NET Core 项目,引用本地类库DLL的方式有三种 1.非同解决方案下的引用,直接引用,浏览,找到对应的DLL,然后确定引用. 这种方式有个不好的地方就是,如果引用的DLL文件里面,也 ...
- 独立线程监控配置文件是否变更,适用于更新了配置文件,不需要重启tomcat服务
直接贴出来代码: package cn.leadeon.utils.file; import java.io.File; import java.io.FileInputStream; import ...
- pdo + 事务处理 处理线性事务
/* * 事物处理线性操作. * 以转账为例 */ header('Content-type:text/html;charset=utf-8'); $opt = array(PDO::ATTR_PER ...
- 3人从小公寓创业,到世界最大引擎公司,Unity创始人谈14年...
Unity创始人David Helgason出席了5月11 - 13日在上海举办的Unite 2017 Shanghai,并在大会期间接受了游戏陀螺的专访,动情地讲述了这14年来从3人在公寓创业,到成 ...
- 洛谷P4014 分配问题(费用流)
传送门 可以把原图看做一个二分图,人在左边,任务在右边,求一个带权的最大和最小完美匹配 然而我并不会二分图做法,所以只好直接用费用流套进去,求一个最小费用最大流和最大费用最大流即可 //minamot ...
- Reviewing notes 1.1 of Analytic geometry
Chapter 1 Vector Algebra ♦ Vector Space Vector and vector space A vector is described as a quantity ...
- Leetcode 8. String to Integer (atoi) atoi函数实现 (字符串)
Leetcode 8. String to Integer (atoi) atoi函数实现 (字符串) 题目描述 实现atoi函数,将一个字符串转化为数字 测试样例 Input: "42&q ...
- js自定义对象 (转)
原文地址:https://sjolzy.cn/js-custom-object.html 29 March 2010 9:53 Monday by 小屋 javascript进阶之对象篇 一,概述 在 ...