使用HttpURLConnection代替HttpClient
来源:互联网 发布:linux定时器函数 编辑:程序博客网 时间:2024/05/21 18:58
使用HttpURLConnection代替HttpClient
在Android的新版本中,apache包中的HttpClient由于安全性等某些原因被删除,甚至整个org.apache都不再包含在Android的API中。这导致了许多原本使用HttpClient来链接Android前端后台的朋友出现了许多困扰。
现在我们有两种方法解决问题:
方法一:
(比较快速,但不是根本解决之道)在Gradle Scripts目录下的build.gradle(Module:app)内的android{}代码块中添加一句:useLibrary ‘org.apache.http.legacy’,如图:
方法二:
(比较慢,但是根本解决之道)Android官方文档给出的建议是:Please use openConnection() instead.就是使用 openConnection()方法来替代。
查看openConnection(),注意到它返回一个URLConnection类型的抽象类对象。针对http的链接问题,我们可以直接使用它的“Direct Subclass”——直接子类,HttpURLConnection。
要点:
1.当发送请求上传数据时,必须配置 setDoOutput(true),通过 getOutputStream() 方法返回的流来传递上传数据;为了更好的性能表现,在已知上传数据大小的情况下调用 setFixedLengthStreamingMode(long contentLength),在不知道大小的情况下,调用setChunkedStreamingMode(int chunkLength),其中chunkLength是你的上传数据要分成的块的大小,太大则会造成内存占用风险,太小就是生成过多的标志信息,一般情况下写0,即采用默认的块大小;
2.当读取返回内容时,通过 getInputStream() 方法来读取返回的流;
3.当关闭连接时,调用 disconnect() 来释放资源;
4.HttpURLConnection 最多将允许5次重定向,但不允许从https到http的重定向。如果返回表明有问题,getInputStream()将会抛出IOException异常,使用 getErrorStream()来读取错误内容;
5.由于返回的输入输出流是没有缓存的,大多数的调用需要包裹在 BufferedInputStream 或 BufferedOutputStream 中,或使用 BufferedReader 或 BufferedWriter;
6.注意在Manifest中声明权限:<uses-permission android:name="android.permission.INTERNET" />
例子:
import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLEncoder;import java.util.Map;/** * Created by Founder on 2016/4/4. * Author:FounderWatts */public class MyConnection { /* * urlStr:网址 * parms:提交数据 * return:网页源码 * */ public String getContextByHttp(String urlStr,Map<String,String> parms){ StringBuilder sb = new StringBuilder(); try{ URL url = new URL(urlStr); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); connection.setRequestMethod("POST"); connection.setReadTimeout(5000); connection.setConnectTimeout(5000); connection.setDoInput(true); connection.setDoOutput(true); connection.setInstanceFollowRedirects(true); OutputStream outputStream = connection.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream,"UTF-8")); writer.write(getStringFromOutput(parms)); writer.flush(); writer.close(); outputStream.close(); if(connection.getResponseCode() == HttpURLConnection.HTTP_OK){ BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String temp; while((temp = reader.readLine()) != null){ sb.append(temp); } reader.close(); }else{ return "connection error:" + connection.getResponseCode(); } connection.disconnect(); }catch (Exception e){ return e.toString(); } return sb.toString(); } private String getStringFromOutput(Map<String,String> map) throws UnsupportedEncodingException { StringBuilder sb = new StringBuilder(); boolean isFirst = true; for(Map.Entry<String,String> entirty:map.entrySet()){ if(isFirst) isFirst = false; else sb.append("&"); sb.append(URLEncoder.encode(entirty.getKey(),"UTF-8")); sb.append("="); sb.append(URLEncoder.encode(entirty.getValue(),"UTF-8")); } return sb.toString(); }}
- 使用HttpURLConnection代替HttpClient
- android 6.0使用httpUrlConnection代替httpClient
- 用HttpURLConnection代替HttpClient
- 《第一行代码》11.3.2 使用 HttpURLConnection 代替 HttpClient
- 使用HttpURLConnection和HttpClient
- 使用HttpURLConnection 和HttpClient
- HttpURLConnection和HttpClient使用
- HttpURLConnection和HttpClient的使用
- httpurlconnection与httpclient的使用
- HttpClient 和 HttpURLConnection 的使用
- HttpClient - HttpUrlConnection
- httpURLConnection httpClient
- HttpURLConnection HttpClient
- HttpClient&HttpURLConnection
- HttpURLConnection +HttpClient
- HttpClient+HttpURLConnection
- HttpUrlConnection与HttpClient的认识(一)-HttpUrlConnection的使用
- HttpUrlConnection与HttpClient的认识(一)-HttpUrlConnection的使用
- 全面理解Javascript闭包和闭包的几种写法及用途
- 多线程初探
- Qt5布局管理(二)——QDockWidget停靠窗口类
- iOS开发之瀑布流
- Java爬虫(一)利用GET和POST发送请求,获取服务器返回信息
- 使用HttpURLConnection代替HttpClient
- 职业发展之面试技巧
- c++基类和派生类
- 后台服务选择
- typedef struct
- CryptoAPI与openssl数字签名与验证交互
- Java基本数据类型
- 【HDU 2604】 Queuing
- JAVA 堆栈 堆 方法区 静态区 final static 内存分配 详解