设为首页 收藏本站
查看: 1496|回复: 0

[经验分享] [转]深入Android通过Apache HTTP访问HTTP资源

[复制链接]

尚未签到

发表于 2015-7-31 08:37:11 | 显示全部楼层 |阅读模式
  本文转自:http://blog.iyunv.com/jiahui524/article/details/6881006
  
深入Android通过Apache HTTP访问HTTP资源

  
  HttpClient接口
  实现类:DefaultHttpClient这也是常用的一个用于实现HttpClient接口的子类,
  HttpClietnt中定义的常用抽象方法
  
方法名称

描述

  public abstract HttpResponse execute (HttpUriRequest request)
  通过HttpUriRequest对象执行返回一个HttpResponse对象
  public abstract HttpResponse execute (HttpUriRequest request, HttpContext context)
  通过HttpUriRequest对象和HttpContext对象执行返回一个HttpResponse对象

  
  HttpResponse接口
  HttpResponse接口里定义了一系列的set、get方法
  
方法名称

描述

  public abstract HttpEntity getEntity ()
  得到一个HttpEntity对象
  public abstract StatusLine getStatusLine ()
  得到一个StatusLine(也就是HTTP协议中的状态行我们知道HTPP状态行由三部分组成:HTTP协议版本,服务器发回的响应状态代码,状态码的文本描述)接口的实例对象
  public abstract Locale getLocale ()
  得到Locale对象
  ….相应的set方法
  

  
  StatusLine接口
  StatusLine接口的常用方法。也可以通过其实现的子类BasicStatusLine类里查看
  
方法名称

描述

  public abstract ProtocolVersion getProtocolVersion ()
  得到一个ProtolVersion对象它是一个HTTP版本的封装类,在这个类里定义了一系列的方法我们可以通过它的getProtocol方法取得协议名称,getMinor得到HTPP协议的版本
  public abstract String getReasonPhrase ()
  状态码的文本描述
  public abstract int getStatusCode ()
  得到响应状态码

  
  
  HttpEntity接口
  HttpEntity是一个接口
  
方法名称

描述

  public abstract InputStream getContent ()
  得到一个输入流对象,我们可以用这个流来操作文件(例如保存文件到SD卡)
  public abstract Header getContentType ()
  得到Content-Type信息头
  public abstract Header getContentEncoding ()
  得到Content-Encoding信息头

  
  我们可以通过EntityUtils类,它是一个final类,一个专门针对于处理HttpEntity的帮助类
  常用方法
  EntityUtils类
  EntityUtils类的常用方法
  
方法名称

描述

  public static String getContentCharSet (HttpEntity entity)
  设置HttpEntity对象的ContentCharset
  public static byte[] toByteArray (HttpEntity entity)
  将HttpClient转换成一个字节数组
  public static String toString (HttpEntity entity, String defaultCharset)
  通过指定的编码方式取得HttpEntity里字符串内容
  public static String toString (HttpEntity entity)
  取得HttpEntity里字符串内容

  
  NameValuePair
  NameValuePair接口是一个简单的封闭的键值对,只提供了一个getName()和一个getValue方法。主要用到的实现类BasicNameVaulePair
  
  HttpGet类
  HttpGet它实现了HttpRequest、HttpUriRequest接口
  构造方法
  
  方法名称
  描述
  public HttpGet ()
  无参数构造方法用以实例化对象
  public HttpGet (URI uri)
  通过URI对象构造HttpGet对象
  public HttpGet (String uri)
  通过指定的uri字符串地址构造实例化HttpGet对象

  
  HttpPost类
  同样它也实现了HttpRequest、HttpUriRequest接口等一系列接口
  构造方法
  
方法名称

描述

  public HttpPost ()
  无参数构造方法用以实例化对象
  public HttpPost (URI uri)
  通过URI对象构造HttpPost对象
  public HttpPost (String uri)
  通过指定的uri字符串地址构造实例化HttpPost对象

  
  
  清楚了上面的所有常用API后,下面我们能过Apache HTTP来访问HTTP资源
  三步曲:
  1.  创建HttpGet或者HttpPost对象,将要请求的URL对象构造方法传入HttpGet、HttpPost对象
  2.  通过HttpClent接口的实现类DefaultClent.的excute(HttpUriRequest request)而我们已经知道HttpGet和HttpPost类都实现了HttpUriRequest接口,所以这里面,我们可以将第1步创建好的HttpGet或者HttpPost对象传入进来。来得到HttpResponse对象
  3.  通过HttpResponse取到返回的一些信息,再做提取
  
  实例图片:
DSC0000.gif
  帖上一部分源代码:
  布局文件:
  



view plaincopy to clipboardprint?

  •   
  •   
  •   
  •   
  •      
  •   
  •         
  •   
  •         
  •   
  •      
  •   
  •      
  •   
  •         
  •   
  •         
  •   
  •      
  •   
  •      
  •   
  •      
  •   
  •         
  •   
  •    
  •   
  •         
  •   
  •      
  •   
  •      
  •   
  •      
  •   
  •   
  
  

  Java代码:
  



view plaincopy to clipboardprint?

  • package com.jiahui.net;  
  •   
  •    
  •   
  • import java.io.InputStream;  
  •   
  •    
  •   
  • import org.apache.http.HttpEntity;  
  •   
  • import org.apache.http.HttpResponse;  
  •   
  • import org.apache.http.StatusLine;  
  •   
  • import org.apache.http.client.HttpClient;  
  •   
  • import org.apache.http.client.methods.HttpGet;  
  •   
  • import org.apache.http.client.methods.HttpPost;  
  •   
  • import org.apache.http.impl.client.DefaultHttpClient;  
  •   
  • import org.apache.http.util.EntityUtils;  
  •   
  •    
  •   
  • import android.app.Activity;  
  •   
  • import android.graphics.Bitmap;  
  •   
  • import android.graphics.BitmapFactory;  
  •   
  • import android.os.Bundle;  
  •   
  • import android.view.View;  
  •   
  • import android.view.View.OnClickListener;  
  •   
  • import android.widget.Button;  
  •   
  • import android.widget.EditText;  
  •   
  • import android.widget.ImageButton;  
  •   
  • import android.widget.ImageView;  
  •   
  • import android.widget.TextView;  
  •   
  • import android.widget.Toast;  
  •   
  •    
  •   
  • public class HTTPDemoActivity extends Activity {  
  •   
  •    
  •   
  •        private Button getBtn, postBtn, imageBtn;  
  •   
  •        private EditText urlText, imageUrlText;  
  •   
  •        private TextView resutlView;  
  •   
  •        private ImageView imageView;  
  •   
  •    
  •   
  •        public void onCreate(Bundle savedInstanceState) {  
  •   
  •               super.onCreate(savedInstanceState);  
  •   
  •               setContentView(R.layout.main);  
  •   
  •    
  •   
  •               urlText = (EditText) findViewById(R.id.urlText);  
  •   
  •               imageUrlText = (EditText) findViewById(R.id.imageurlText);  
  •   
  •    
  •   
  •               resutlView = (TextView) findViewById(R.id.resultView);  
  •   
  •               getBtn = (Button) findViewById(R.id.getBtn);  
  •   
  •               postBtn = (Button) findViewById(R.id.postBtn);  
  •   
  •               imageBtn = (Button) findViewById(R.id.imgBtn);  
  •   
  •               imageView = (ImageView) findViewById(R.id.imgeView01);  
  •   
  •    
  •   
  •               getBtn.setOnClickListener(new OnClickListener() {  
  •   
  •                      @Override  
  •   
  •                      public void onClick(View v) {  
  •   
  •                             System.out.println(urlText.getText().toString());  
  •   
  •                             resutlView  
  •   
  •                                           .setText(request("GET", urlText.getText().toString()));  
  •   
  •                      }  
  •   
  •               });  
  •   
  •                
  •   
  •               postBtn.setOnClickListener(new OnClickListener() {  
  •   
  •                      public void onClick(View v) {  
  •   
  •                             System.out.println(urlText.getText().toString());  
  •   
  •                             resutlView  
  •   
  •                                           .setText(request("POST", urlText.getText().toString()));  
  •   
  •                      }  
  •   
  •               });  
  •   
  •               imageBtn.setOnClickListener(new OnClickListener() {  
  •   
  •    
  •   
  •                      public void onClick(View v) {  
  •   
  •    
  •   
  •                             getImage(imageUrlText.getText().toString());  
  •   
  •                      }  
  •   
  •               });  
  •   
  •        }  
  •   
  •        private String request(String method, String url) {  
  •   
  •               HttpResponse httpResponse = null;  
  •   
  •               StringBuffer result = new StringBuffer();  
  •   
  •               try {  
  •   
  •                      if (method.equals("GET")) {  
  •   
  •                             // 1.通过url创建HttpGet对象   
  •   
  •                             HttpGet httpGet = new HttpGet(url);  
  •   
  •                             // 2.通过DefaultClient的excute方法执行返回一个HttpResponse对象   
  •   
  •                             HttpClient httpClient = new DefaultHttpClient();  
  •   
  •                             httpResponse = httpClient.execute(httpGet);  
  •   
  •                             // 3.取得相关信息   
  •   
  •                             // 取得HttpEntiy   
  •   
  •                             HttpEntity httpEntity = httpResponse.getEntity();  
  •   
  •                             // 得到一些数据   
  •   
  •                             // 通过EntityUtils并指定编码方式取到返回的数据   
  •   
  •                             result.append(EntityUtils.toString(httpEntity, "utf-8"));  
  •   
  •                             //得到StatusLine接口对象   
  •   
  •                             StatusLine statusLine = httpResponse.getStatusLine();  
  •   
  •    
  •   
  •                             //得到协议   
  •   
  •                             ;  
  •   
  •                             result.append("协议:" + statusLine.getProtocolVersion() + "\r\n");  
  •   
  •                             int statusCode = statusLine.getStatusCode();  
  •   
  •    
  •   
  •                             result.append("状态码:" + statusCode + "\r\n");  
  •   
  •    
  •   
  •                      } else if (method.equals("POST")) {  
  •   
  •    
  •   
  •                             // 1.通过url创建HttpGet对象   
  •   
  •                             HttpPost httpPost = new HttpPost(url);  
  •   
  •                             // 2.通过DefaultClient的excute方法执行返回一个HttpResponse对象   
  •   
  •                             HttpClient httpClient = new DefaultHttpClient();  
  •   
  •                             httpResponse = httpClient.execute(httpPost);  
  •   
  •                             // 3.取得相关信息   
  •   
  •                             // 取得HttpEntiy   
  •   
  •                             HttpEntity httpEntity = httpResponse.getEntity();  
  •   
  •                             // 得到一些数据   
  •   
  •                             // 通过EntityUtils并指定编码方式取到返回的数据   
  •   
  •                             result.append(EntityUtils.toString(httpEntity, "utf-8"));  
  •   
  •                             StatusLine statusLine = httpResponse.getStatusLine();  
  •   
  •                             statusLine.getProtocolVersion();  
  •   
  •                             int statusCode = statusLine.getStatusCode();  
  •   
  •    
  •   
  •                             result.append("状态码:" + statusCode + "\r\n");  
  •   
  •    
  •   
  •                      }  
  •   
  •               } catch (Exception e) {  
  •   
  •                      Toast.makeText(HTTPDemoActivity.this, "网络连接异常", Toast.LENGTH_LONG)  
  •   
  •                                    .show();  
  •   
  •               }  
  •   
  •               return result.toString();  
  •   
  •        }  
  •   
  •    
  •   
  •        public void getImage(String url) {  
  •   
  •               try {  
  •   
  •                      // 1.通过url创建HttpGet对象   
  •   
  •                      HttpGet httpGet = new HttpGet(url);  
  •   
  •                      // 2.通过DefaultClient的excute方法执行返回一个HttpResponse对象   
  •   
  •                      HttpClient httpClient = new DefaultHttpClient();  
  •   
  •                      HttpResponse httpResponse = httpClient.execute(httpGet);  
  •   
  •                      // 3.取得相关信息   
  •   
  •                      // 取得HttpEntiy   
  •   
  •                      HttpEntity httpEntity = httpResponse.getEntity();  
  •   
  •                      // 4.通过HttpEntiy.getContent得到一个输入流   
  •   
  •                      InputStream inputStream = httpEntity.getContent();  
  •   
  •                      System.out.println(inputStream.available());  
  •   
  •                        
  •   
  •                      //通过传入的流再通过Bitmap工厂创建一个Bitmap   
  •   
  •                      Bitmap bitmap = BitmapFactory.decodeStream(inputStream);  
  •   
  •                      //设置imageView            
  •   
  •                      imageView.setImageBitmap(bitmap);  
  •   
  •               } catch (Exception e) {  
  •   
  •                      Toast.makeText(HTTPDemoActivity.this, "网络连接异常", Toast.LENGTH_LONG)  
  •   
  •                      .show();  
  •   
  •               }  
  •   
  •        }  
  •   
  •    
  •   
  • }  
  package com.jiahui.net;import java.io.InputStream;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.StatusLine;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.util.EntityUtils;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.ImageButton;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;public class HTTPDemoActivity extends Activity {private Button getBtn, postBtn, imageBtn;private EditText urlText, imageUrlText;private TextView resutlView;private ImageView imageView;public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);urlText = (EditText) findViewById(R.id.urlText);imageUrlText = (EditText) findViewById(R.id.imageurlText);resutlView = (TextView) findViewById(R.id.resultView);getBtn = (Button) findViewById(R.id.getBtn);postBtn = (Button) findViewById(R.id.postBtn);imageBtn = (Button) findViewById(R.id.imgBtn);imageView = (ImageView) findViewById(R.id.imgeView01);getBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {System.out.println(urlText.getText().toString());resutlView.setText(request("GET", urlText.getText().toString()));}});postBtn.setOnClickListener(new OnClickListener() {public void onClick(View v) {System.out.println(urlText.getText().toString());resutlView.setText(request("POST", urlText.getText().toString()));}});imageBtn.setOnClickListener(new OnClickListener() {public void onClick(View v) {getImage(imageUrlText.getText().toString());}});}private String request(String method, String url) {HttpResponse httpResponse = null;StringBuffer result = new StringBuffer();try {if (method.equals("GET")) {// 1.通过url创建HttpGet对象HttpGet httpGet = new HttpGet(url);// 2.通过DefaultClient的excute方法执行返回一个HttpResponse对象HttpClient httpClient = new DefaultHttpClient();httpResponse = httpClient.execute(httpGet);// 3.取得相关信息// 取得HttpEntiyHttpEntity httpEntity = httpResponse.getEntity();// 得到一些数据// 通过EntityUtils并指定编码方式取到返回的数据result.append(EntityUtils.toString(httpEntity, "utf-8"));//得到StatusLine接口对象StatusLine statusLine = httpResponse.getStatusLine();//得到协议;result.append("协议:" + statusLine.getProtocolVersion() + "\r\n");int statusCode = statusLine.getStatusCode();result.append("状态码:" + statusCode + "\r\n");} else if (method.equals("POST")) {// 1.通过url创建HttpGet对象HttpPost httpPost = new HttpPost(url);// 2.通过DefaultClient的excute方法执行返回一个HttpResponse对象HttpClient httpClient = new DefaultHttpClient();httpResponse = httpClient.execute(httpPost);// 3.取得相关信息// 取得HttpEntiyHttpEntity httpEntity = httpResponse.getEntity();// 得到一些数据// 通过EntityUtils并指定编码方式取到返回的数据result.append(EntityUtils.toString(httpEntity, "utf-8"));StatusLine statusLine = httpResponse.getStatusLine();statusLine.getProtocolVersion();int statusCode = statusLine.getStatusCode();result.append("状态码:" + statusCode + "\r\n");}} catch (Exception e) {Toast.makeText(HTTPDemoActivity.this, "网络连接异常", Toast.LENGTH_LONG).show();}return result.toString();}public void getImage(String url) {try {// 1.通过url创建HttpGet对象HttpGet httpGet = new HttpGet(url);// 2.通过DefaultClient的excute方法执行返回一个HttpResponse对象HttpClient httpClient = new DefaultHttpClient();HttpResponse httpResponse = httpClient.execute(httpGet);// 3.取得相关信息// 取得HttpEntiyHttpEntity httpEntity = httpResponse.getEntity();// 4.通过HttpEntiy.getContent得到一个输入流InputStream inputStream = httpEntity.getContent();System.out.println(inputStream.available());//通过传入的流再通过Bitmap工厂创建一个BitmapBitmap bitmap = BitmapFactory.decodeStream(inputStream);//设置imageView          imageView.setImageBitmap(bitmap);} catch (Exception e) {Toast.makeText(HTTPDemoActivity.this, "网络连接异常", Toast.LENGTH_LONG).show();}}}
  

  开发注意事项:
  1.要想访问本地机器不能写成localhost或者127.0.0.1要写成10.0.2.2。这是因为Android模拟器(simulator)把它自己作为了localhost,也就是说,代码中使用localhost或者127.0.0.1来访问,都是访问模拟器自己!若你想在模拟器simulator上面访问你的电脑,那么就使用android内置的IP: 10.0.2.2,10.0.2.2是模拟器设定的特定ip,是你电脑的别名,在模拟器上用10.0.2.2就能成功访问你的电脑本机。
  2.记得加上网络访问权限
  
  
源代码下载:http://download.iyunv.com/detail/jiahui524/3690598
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-92482-1-1.html 上篇帖子: Windows下apache+tomcat负载均衡 下篇帖子: Mac下Apache Tomcat安装配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表