httpUrlConnection和httpClient的适用场合及详细例子
2016-12-01 17:20
537 查看
概念:http协议是现在internet上使用最多的协议,大部分java程序需要通过http协议来访问网络资源。
HttpURLConnection是官方的标准,这一点体现在安卓上特别明显,并且goole也优化过HttpURLConnection,并推荐使用它,从速度上讲HttpURLConnection直接在系统层面做了缓存策略处理,加快重复的请求速度,所以如果你是安卓开发的就尽量使用HttpURLConnection。而HttpClient是有Apache开发的,确实功能强,更容易控制细节开发更加丰富灵活的http程序,但是一般的java程序使用http协议时,由于HttpUrlConnection对大部分工作进行了包装,屏蔽了不需要的细节,更适合开发人员直接调用,还是推荐HttpURLConnection,但对于更多的细节控制如:代理、COOKIE、鉴权、压缩、连接池之类的操作肯定是HttpClient更加合适。
所谓存在即合理,两种方式都很好,在实际开发中可根据公司的框架和实际需求选择合理的方式。
下面是两种方法读取网络图片的例子(例子是我好久以前学习的时候引用别人博客做了一些修改,实在想不起来是谁的了,在此表示感谢),都有注释,大家体会下:
HttpURLConnection例子(不用另导jar包)
HttpClient例子(需导jar包,jar包下载地址:http://download.csdn.net/detail/u010182075/7145491)
HttpURLConnection是官方的标准,这一点体现在安卓上特别明显,并且goole也优化过HttpURLConnection,并推荐使用它,从速度上讲HttpURLConnection直接在系统层面做了缓存策略处理,加快重复的请求速度,所以如果你是安卓开发的就尽量使用HttpURLConnection。而HttpClient是有Apache开发的,确实功能强,更容易控制细节开发更加丰富灵活的http程序,但是一般的java程序使用http协议时,由于HttpUrlConnection对大部分工作进行了包装,屏蔽了不需要的细节,更适合开发人员直接调用,还是推荐HttpURLConnection,但对于更多的细节控制如:代理、COOKIE、鉴权、压缩、连接池之类的操作肯定是HttpClient更加合适。
所谓存在即合理,两种方式都很好,在实际开发中可根据公司的框架和实际需求选择合理的方式。
下面是两种方法读取网络图片的例子(例子是我好久以前学习的时候引用别人博客做了一些修改,实在想不起来是谁的了,在此表示感谢),都有注释,大家体会下:
HttpURLConnection例子(不用另导jar包)
package cangku; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; /** * @说明 从网络获取图片到本地 * @author lightTrace * @version 1.0 * @since */ public class httpurlconnection { /** * 测试 * @param args */ public static void main(String[] args) { String url = "http://ww2.sinaimg.cn/large/9d57a855jw1dqpv9fp4yuj.jpg"; byte[] btImg = getImageFromNetByUrl(url); if(null != btImg && btImg.length > 0){ System.out.println("读取到:" + btImg.length + " 字节"); String fileName = "瞄httpurlconnection.jpg"; writeImageToDisk(btImg, fileName); }else{ System.out.println("没有从该连接获得内容"); } } /** * 将图片写入到磁盘 * @param img 图片数据流 * @param fileName 文件保存时的名称 */ public static void writeImageToDisk(byte[] img, String fileName){ try { File file = new File("C:\\" + fileName); FileOutputStream fops = new FileOutputStream(file); fops.write(img); fops.flush(); fops.close(); System.out.println("图片已经写入到C盘"); } catch (Exception e) { e.printStackTrace(); } } /** * 根据地址获得数据的字节流 * @param strUrl 网络连接地址 * @return */ public static byte[] getImageFromNetByUrl(String strUrl){ try { URL url = new URL(strUrl);//创建url对象 HttpURLConnection conn = (HttpURLConnection)url.openConnection();//根据url对象创建HttpURLConnection的conn对象 conn.setRequestMethod("GET");//设置请求方式 InputStream inStream = conn.getInputStream();//通过输入流获取图片数据 byte[] btImg = readInputStream(inStream);//得到图片的二进制数据 return btImg; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 从输入流中获取数据 * @param inStream 输入流 * @return * @throws Exception */ public static byte[] readInputStream(InputStream inStream) throws Exception{ ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024];//一次读取1024个字节 int len = 0; while( (len=inStream.read(buffer)) != -1 ){ outStream.write(buffer, 0, len); } inStream.close(); return outStream.toByteArray(); } }
HttpClient例子(需导jar包,jar包下载地址:http://download.csdn.net/detail/u010182075/7145491)
package cangku; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; /** * @说明 从网络获取图片到本地 * @author lightTrace * @version 1.0 * @since */ public class httpClient { public static void main(St 4000 ring[] args) throws Exception { //图片的网址 String url = "http://ww2.sinaimg.cn/large/9d57a855jw1dqpv9fp4yuj.jpg"; String destfilename = "D:\\喵httpclient.jpg"; //生成一个httpclient对象 CloseableHttpClient httpclient = HttpClients.createDefault(); HttpGet httpget = new HttpGet(url);//设置请求方式 HttpResponse response = httpclient.execute(httpget);//设置http输出类型对象 HttpEntity entity = response.getEntity();//创建一个实体对象,实体对象可以是流也可以是字符串 InputStream in = entity.getContent();//创建实体内容的输入流对象 File file = new File(destfilename);//保存文件的路劲 try { FileOutputStream fout = new FileOutputStream(file);//创建输出流对象 int l = -1; byte[] tmp = new byte[1024];//一次读取1024个字节 while ((l = in.read(tmp)) != -1) { fout.write(tmp,0,l);//将输入的流一次读取1024个字节读出到指定文件路劲 //注意这里如果用OutputStream.write(buff)的话,图片会失真,大家可以试试 } fout.flush(); fout.close(); } finally { // 关闭低层流。 in.close(); } httpclient.close(); } }
相关文章推荐
- android httpclient httpurlconnection
- HttpClient - HttpUrlConnection
- HttpClient与HttpURLConnection的请求方式
- android-HttpClient和HttpURLConnection判断网络连接
- HttpURLConnection掉远程接口的例子
- Java客户端HttpClient和HttpURLConnection修改请求头Host问题
- Use java.net.HttpURLConnection/HttpClient 访问web service ( HTTP/HTTPS)
- Android网络连接之HttpURLConnection和HttpClient
- android中httpclient和HttpURLConnection优缺点和常见bug解决方法
- Java乔晓松-httpURLConnection、URL、httpClient、httpPost、httpGet之代码详解篇
- HttpURLConnection与HttpClient的不同
- Java网络连接之HttpURLConnection与HttpClient 区别及联系
- Android网络连接之HttpURLConnection和HttpClient
- Android网络连接之HttpURLConnection和HttpClient
- 用HttpURLConnection在服务器端发起HTTP Post请求的例子
- Android网络连接之HttpURLConnection和HttpClient
- android-HttpClient和HttpURLConnection判断网络连接
- Android网络连接之HttpURLConnection和HttpClient
- 关于安卓HTTP请求用HttpUrlConnection还是HttpClient好
- Java网络连接之HttpURLConnection与HttpClient 区别及联系