在工作中要用到android,然后进行网络请求的时候,打算使用httpClient。
总结一下httpClient的一些基本使用。
版本是4.2.2。
使用这个版本的过程中,百度很多,结果都是出现的org.apache.commons.httpclient.这个包名,而不是我这里的org.apache.http.client.HttpClient----------前者版本是Commons HttpClient 3.x,不是最新的版本HttpClient 4.×。
官网上面:
Commons HttpClient 3.xcodeline is at the end of life. All users of Commons HttpClient 3.xare strongly encouraged to upgrade to HttpClient 4.1.
1.基本的get
Java代码- publicvoidgetUrl(Stringurl,Stringencoding)
- throwsClientProtocolException,IOException{
- //默认的client类。
- HttpClientclient=newDefaultHttpClient();
- //设置为get取连接的方式.
- HttpGetget=newHttpGet(url);
- //得到返回的response.
- HttpResponseresponse=client.execute(get);
- //得到返回的client里面的实体对象信息.
- HttpEntityentity=response.getEntity();
- if(entity!=null){
- System.out.println("内容编码是:"+entity.getContentEncoding());
- System.out.println("内容类型是:"+entity.getContentType());
- //得到返回的主体内容.
- InputStreaminstream=entity.getContent();
- try{
- BufferedReaderreader=newBufferedReader(
- newInputStreamReader(instream,encoding));
- System.out.println(reader.readLine());
- }catch(Exceptione){
- e.printStackTrace();
- }finally{
- instream.close();
- }
- }
- //关闭连接.
- client.getConnectionManager().shutdown();
- }
2.基本的Post
下面的params参数,是在表单里面提交的参数。
Java代码 cookies =httpclient.getCookieStore().getCookies(); if (cookies.isEmpty()) {System.out.println("None"); } else { for (int i = 0; i <cookies.size(); i++) { System.out.println("- " +cookies.get(i).toString()); } } } finally { // 关闭请求httpclient.getConnectionManager().shutdown(); } }" quality="high"allowscriptaccess="always" type="application/x-shockwave-flash"pluginspage="http://www.macromedia.com/go/getflashplayer">
- publicvoidpostUrlWithParams(Stringurl,Mapparams,Stringencoding)
- throwsException{
- DefaultHttpClienthttpclient=newDefaultHttpClient();
- try{
- HttpPosthttpost=newHttpPost(url);
- //添加参数
- Listnvps=newArrayList();
- if(params!=null&¶ms.keySet().size()>0){
- Iteratoriterator=params.entrySet().iterator();
- while(iterator.hasNext()){
- Map.Entryentry=(Entry)iterator.next();
- nvps.add(newBasicNameValuePair((String)entry.getKey(),
- (String)entry.getValue()));
- }
- }
- httpost.setEntity(newUrlEncodedFormEntity(nvps,Consts.UTF_8));
- HttpResponseresponse=httpclient.execute(httpost);
- HttpEntityentity=response.getEntity();
- System.out.println("Loginformget:"+response.getStatusLine()
- +entity.getContent());
- dump(entity,encoding);
- System.out.println("Postlogoncookies:");
- Listcookies=httpclient.getCookieStore().getCookies();
- if(cookies.isEmpty()){
- System.out.println("None");
- }else{
- for(inti=0;i<cookies.size();i++){
- System.out.println("-"+cookies.get(i).toString());
- }
- }
- }finally{
- //关闭请求
- httpclient.getConnectionManager().shutdown();
- }
- }
3。打印页面输出的小代码片段
Java代码- privatestaticvoiddump(HttpEntityentity,Stringencoding)
- throwsIOException{
- BufferedReaderbr=newBufferedReader(newInputStreamReader(
- entity.getContent(),encoding));
- System.out.println(br.readLine());
- }
4.常见的登录session问题,需求:使用账户,密码登录系统之后,然后再访问页面不出错。
特别注意,下面的httpclient对象要使用一个,而不要在第二次访问的时候,重新new一个。至于如何保存这个第一步经过了验证的httpclient,有很多种方法实现。单例,系统全局变量(android下面的Application),ThreadLocal变量等等。
以及下面创建的httpClient要使用ThreadSafeClientConnManager对象!
public StringgetSessionId(String url, Map params, String encoding,
Java代码- Stringurl2)throwsException{
- DefaultHttpClienthttpclient=newDefaultHttpClient(
- newThreadSafeClientConnManager());
- try{
- HttpPosthttpost=newHttpPost(url);
- //添加参数
- Listnvps=newArrayList();
- if(params!=null&¶ms.keySet().size()>0){
- Iteratoriterator=params.entrySet().iterator();
- while(iterator.hasNext()){
- Map.Entryentry=(Entry)iterator.next();
- nvps.add(newBasicNameValuePair((String)entry.getKey(),
- (String)entry.getValue()));
- }
- }
- //设置请求的编码格式
- httpost.setEntity(newUrlEncodedFormEntity(nvps,Consts.UTF_8));
- //登录一遍
- httpclient.execute(httpost);
- //然后再第二次请求普通的url即可。
- httpost=newHttpPost(url2);
- BasicResponseHandlerresponseHandler=newBasicResponseHandler();
- System.out.println(httpclient.execute(httpost,responseHandler));
- }finally{
- //关闭请求
- httpclient.getConnectionManager().shutdown();
- }
- return"";
- }
5.下载文件,例如mp3等等。
Java代码- //第一个参数,网络连接;第二个参数,保存到本地文件的地址
- publicvoidgetFile(Stringurl,StringfileName){
- HttpClienthttpClient=newDefaultHttpClient();
- HttpGetget=newHttpGet(url);
- try{
- ResponseHandler<<span>byte[]>handler=newResponseHandler<<span>byte[]>(){
- publicbyte[]handleResponse(HttpResponseresponse)
- throwsClientProtocolException,IOException{
- HttpEntityentity=response.getEntity();
- if(entity!=null){
- returnEntityUtils.toByteArray(entity);
- }else{
- returnnull;
- }
- }
- };
- byte[]charts=httpClient.execute(get,handler);
- FileOutputStreamout=newFileOutputStream(fileName);
- out.write(charts);
- out.close();
- }catch(Exceptione){
- e.printStackTrace();
- }finally{
- httpClient.getConnectionManager().shutdown();
- }
- }
6.创建一个多线程环境下面可用的httpClient
(原文:http://blog.csdn.net/jiaoshi0531/article/details/6459468)
Java代码