再探网络连接--HttpURLConnection
来源:互联网 发布:按键精灵修改mac 编辑:程序博客网 时间:2024/05/22 05:23
首先,HttpURLConnection应该算是HttpClient的替换者,度娘说HttpClient是对于HttpURLConnection的封装,这里由于不能拜读源码,所以没有办法验证,但是HttpClient确实有那么一点封装的意思。
---------HttpClient链接地址-----------
介绍:HttpURLConnection是一个和服务器servlet交互的轻量级组件,它是基于socket层的请求层API。
二者的区别:
1.首先,HttpClient是属于org.apache.http包下的各个Api,而HttpURLConnection是java.net下的组件,二者有着本质的区别,Httpclient拥有众多Api、BUG较少、实现稳定,这使得它的可维护和扩展性降低,所以Android团队更新它的积极性较低。并且在Android2.3及之后更推荐使用HttpURLConnection。Android5.1中HttpClient已成过时。
2.HttpClient封装性高,使用简单。而HttpURLConnection是一个轻量级的组件,它的可扩展性高。
这两种方式都支持HTTPS协议、以流的形式进行上传和下载、配置超时时间、IPv6、以及连接池等功能
HttpURLConnection的优势:API简单、体积较小,所以非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。
执行顺序:
验证自Debug,由于没有UML,只能用画图工具(真难用啊!),如图:
----------------------------------------我是华丽的分割线---------------------------------------------
HttpURLConnection urlConnection=null;//创建URL(统一资源定位器)对象URL u=new URL(url);//获得一个URLConnection(可设定代理),并没有链接服务器urlConnection=(HttpURLConnection)u.openConnection();//设置超时urlConnection.setConnectTimeout(30000);urlConnection.setReadTimeout(30000);//设置请求的方式urlConnection.setRequestMethod("POST");urlConnection.setDoInput(true);//设置是否从网络读取数据urlConnection.setDoOutput(true);//设置是否向网络发出数据请求//设置处理请求参数的字符串StringBuffer body = new StringBuffer();if(params != null && !params.isEmpty()){Set<Entry<String,String>> entites = params.entrySet();boolean isFirst = true;for(Entry<String, String> entry : entites){if(!isFirst){body.append("&");}body.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(),"UTF-8"));isFirst = false;}//创建ObjectOutputStream输出流,输出流基本都可以,这一步才开始联网ObjectOutputStream obj=new ObjectOutputStream(urlConnection.getOutputStream());obj.writeBytes(body.toString());//清空缓冲区,并关闭连接obj.flush();obj.close();}//如果有session就上传if(null != JSESSIONID){urlConnection.setRequestProperty("Cookie", "JSESSIONID="+JSESSIONID);//req.setHeader("Cookie","JSESSIONID="+JSESSIONID);}//判断状态,是否为请求成功(200)if(urlConnection.getResponseCode() != HttpURLConnection.HTTP_OK){msg = "服务器繁忙,请稍后重试!";}else{//获得输入流InputStream is = urlConnection.getInputStream();ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[4096];int ss = 0;while((ss = is.read(buffer))!=-1){baos.write(buffer,0,ss);}String responseBody = new String(baos.toByteArray(),"UTF-8");response = new JSONObject(responseBody);}//销毁链接urlConnection.disconnect();
请求方式的区别:
GET:可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet。
POST:参数不是放在URL字串里面,而是放在http请求的正文内。
异常解决:
1.Web服务器出现java.io.EOFExecption的原因是,移动端(安卓)向服务器发送数据的时候对象没有实现序列化,或不能解析。
解决方案:设置urlConnection.setRequestProperty("Content-type","application/x-java-serialized-object");
2.调试的时候总是不过,或请求超时,或得不到数据,可能因为断点的存在。如设置了超时时间后再断点。
- 再探网络连接--HttpURLConnection
- HttpUrlConnection网络连接
- HttpUrlConnection 网络连接
- 网络连接+HttpUrlConnection+AsyncTask
- android 网络连接1:HttpURLConnection
- 网络连接——HttpURLConnection
- Android的网络连接HttpUrlConnection
- HttpURLConnection和HttpClient连接网络
- Android网络连接之HttpURLConnection和HttpClient
- HttpURLConnection时遇到网络连接失败
- android-HttpClient和HttpURLConnection判断网络连接
- Android网络连接之HttpURLConnection和HttpClient
- android HttpURLConnection 连接网络 读取返回数据
- Java网络连接之HttpURLConnection与HttpClient
- Android网络连接之HttpURLConnection和HttpClient
- Android网络连接之HttpURLConnection和HttpClient
- Android网络连接之HttpURLConnection和HttpClient
- Android网络连接之HttpURLConnection和HttpClient
- Unknown MySQL server host 'localhost' (0)
- 【React Native 安卓开发】----(mac下开发环境配置)【第一篇】
- 前端整站的性能优化
- Java Spring 入门
- Apache站点安全配置 身份认证
- 再探网络连接--HttpURLConnection
- 指针函数与函数指针
- linux sort
- 设计模式六大原则: 辅导班的因材施教 -- 接口隔离原则
- MySQL5.7新特性
- java实现经纬度坐标是否在范围内的算法
- Type Incompatible operand types String and int
- Effective Modern C++ 条款8 用nullptr代替0和NULL
- 线程同步之关键段