【计算机网络】详解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个字节,格外开销较小 ...
随机推荐
- mysql sp 练习游标和预编译
create procedure Jack_count_cur_dual() BEGIN ); ; DECLARE mycur CURSOR for SELECT table_name FROM tt ...
- SQL Server 常用函数总结
SQL去空格函数 1.ltrim(‘内容’)--去掉字符左边的空格 代码如下 declare @str varchar(100) set @str=' ADFADF' select @str sele ...
- eclipse 开发hbase 环境准备
修改开发机的host文件:
- ES更改参数max_result_window
今天开发那边说翻页超过10000报错.早上来查阅官网手册,说from/size默认是10000.通过参数index.max_result_window进行控制.那么直接改这个参数即可. 1.先看看默认 ...
- 【bzoj3670】: [Noi2014]动物园 字符串-kmp-倍增
[bzoj3670]: [Noi2014]动物园 一开始想的是按照kmp把fail算出来的同时就可以递推求出第i位要f次可以跳到-1 然后把从x=i开始顺着fail走,走到fail[x]*2<i ...
- 【转】C#工程连接oracle的一种方式
源地址:https://blog.csdn.net/qq_16542775/article/details/52689068 项目中有个功能需要从一台Oracle数据库获取数据,本以为是很简单的事情, ...
- 开发效率神器 uTools - 偏前端和 UI
本文首发于:Bougie's Blog - 效率神器 uTools 前言 今天组内公众号推荐了 Mac 上的效率神器 Alfred. 详情链接:效率神器 Alfred workflow 插件推荐 早上 ...
- I/O(输入/输出)---序列化与反序列化
概念: 序列化就是将对象的状态存储到特定的介质中的过程,也就是将对象状态转换为可保持或传输格式的过程. 反序列化则是从特定存储介质中将数据重新构建对象的过程.可以将存储在文件上的对象信息读取,然后重新 ...
- docker构建mysql容器及Navicat 远程连接
1. MySQL部署 1.1拉取MySQL镜像 docker pull mysql 查看镜像 docker images 1.2创建MySQL容器 首先建立所需要的 文件夹: docker run - ...
- php文件下载方法收藏(附js下载技巧)
function down($url){ header('Content-Description: File Transfer'); header('Content-Type: application ...