1、HTTP协议初探:html
HTTP(Hypertext Transfer Protocol)中文 “超文本传输协议”,是一种为分布式,合做式,多媒体信息系统服务,面向应用层的协议,是Internet上眼下使用最普遍的应用层协议。它基于传输层的TCP协议进行通讯,HTTP协议是通用的、无状态的协议。java
这几个名词有一种通俗的解释:android
HTTP协议与Android开发之间的关系:apache
HTTP协议的学习重点:编程
WWW的工做是基于客户机/server计算模型,由Web浏览器和Webserver构成,二者之间採用超文本传输协议HTTP进行通讯。浏览器
3、使用HTTP协议訪问网络:缓存
Android中的WebView控件已经在后台帮咱们处理好了发送HTTP请求、接收服务响应、解析返回数据,以及终于的页面展现这几步工做,只是由于它封装得太好了,反而不能直观地看出HTTP协议是怎样工做的。所以接下来咱们经过手动发送HTTP请求的方式。来更加深刻的了解这一过程。网络
在Android上发送HTTP请求的方式通常有两种:HttpURLConnection和HttpClient。架构
咱们先来学习HttpClient。app
4、HttpCient:
HttpClient是Apache开源组织提供的HTTP网络訪问接口(一个开源的项目)。从名字上就可以看出。它是一个简单的HTTPclient(并不是浏览器)。可以发送HTTP请求,接受HTTP响应。但是不会缓存server的响应。不能运行HTTP页面中签入嵌入的JS代码,天然也不会对页面内容进行不论什么解析、处理,这些都是需要开发者来完毕的。
现在Android已经成功集成了HttpClient,因此开发者在Android项目中可以直接使用HttpClient来向Web网站提交请求以及接受响应,假设使用其它的Java项目,需要引入进对应的Jar包。HttpClient可以在官网上下载。
官网连接:http://hc.apache.org/downloads.cgi
HttpClient事实上是一个interface类型,HttpClient封装了对象需要运行的Http请求、身份验证、链接管理和其余特性。
既然HttpClient是一个接口,所以没法建立它的实例。从文档上看。HttpClient有三个已知的实现类各自是:AbstractHttpClient, AndroidHttpClient, DefaultHttpClient,会发现有一个专门为Android应用准备的实现类AndroidHttpClient,固然使用常规的DefaultHttpClient也可以实现功能。
从两个类包所有在位置就可以看出差异,AndroidHttpClient定义在android.net.http.AndroidHttpClient包下,属于Android原生的http訪问。而DefaultHttpClient定义在org.apache.http.impl.client.DefaultHttpClient包下,属于对apche项目的支持。而AndroidHttpClient没有公开的构造函数,仅仅能经过静态方法newInstance()方法来得到AndroidHttpClient对象。
简单来讲,用HttpClient发送请求、接收响应都很是easy,仅仅需要五大步骤就能够:(要牢记)
注:对于发送请求的參数,GET和POST使用的方式不一样。GET方式可以使用拼接字符串的方式。把參数拼接在URL结尾。POST方式需要使用setEntity(HttpEntity entity)方法来设置请求參数。
5、DefaultHttpClient:
依据上面的五大步骤,咱们就拿DefaultHttpClient举例来訪问网络。
注意这里有一条原则:在主线程中不能訪问网络(在android4.0以后的增长的概念)。
一个demo:点击button,获取百度首页的文本内容
新建project文件m04_http01。
完整版代码例如如下:
首先是布局文件。尽管比較简单。但仍是贴上吧。
activity_main.xml代码例如如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Send Request" /> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/TextView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/hello_world" /> </ScrollView> </LinearLayout>
布局文件里,咱们用一个ScrollView来包裹TextView。借助ScrollView控件的话。就可以赞成咱们一滚动的形式查看屏幕外i的那部份内容。
MainActivity.java的代码例如如下:(凝视比較具体)
package com.example.m04_http01; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { public static final int SHOW_RESPONSE = 0; private Button button_sendRequest; private TextView textView_response; //新建Handler的对象,在这里接收Message。而后更新TextView控件的内容 private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case SHOW_RESPONSE: String response = (String) msg.obj; textView_response.setText(response); break; default: break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView_response = (TextView)findViewById(R.id.TextView1); button_sendRequest = (Button)findViewById(R.id.button1); button_sendRequest.setOnClickListener(new OnClickListener() { //点击按钮时。运行sendRequestWithHttpClient()方法里面的线程 @Override public void onClick(View v) { // TODO Auto-generated method stub sendRequestWithHttpClient(); } }); } //方法:发送网络请求,获取百度首页的数据。在里面开启线程 private void sendRequestWithHttpClient() { new Thread(new Runnable() { @Override public void run() { //用HttpClient发送请求,分为五步 //第一步:建立HttpClient对象 HttpClient httpCient = new DefaultHttpClient(); //第二步:建立表明请求的对象,參数是訪问的server地址 HttpGet httpGet = new HttpGet("http://www.baidu.com"); try { //第三步:运行请求,获取server发还的响应对象 HttpResponse httpResponse = httpCient.execute(httpGet); //第四步:检查响应的状态是否正常:检查状态码的值是200表示正常 if (httpResponse.getStatusLine().getStatusCode() == 200) { //第五步:从对应对象其中取出数据。放到entity其中 HttpEntity entity = httpResponse.getEntity(); String response = EntityUtils.toString(entity,"utf-8");//将entity其中的数据转换为字符串 //在子线程中将Message对象发出去 Message message = new Message(); message.what = SHOW_RESPONSE; message.obj = response.toString(); handler.sendMessage(message); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start();//这个start()方法不要忘记了 } }
最后要记得在清单文件里声明訪问网络的权限:
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16" /> <uses-permission android:name="android.permission.INTERNET"/>程序执行后,点击button,显示结果例如如下:
关于http协议的学习,推荐两个连接:
http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html