Android系列之⽹络(⼀)----使⽤HttpClient发送HTTP请求(通
过get。。。
【声明】
欢迎转载,但请保留⽂章原始出处→_→
【系列】Android系列之⽹络:(持续更新)
【正⽂】
⼀、HTTP协议初探:
HTTP(Hypertext Transfer Protocol)中⽂ “超⽂本传输协议”,是⼀种为分布式,合作式,多媒体信息系统服务,⾯向应⽤层的协议,是Internet上⽬前使⽤最⼴泛的应⽤层协议,它基于传输层的TCP协议进⾏通信,HTTP协议是通⽤的、⽆状态的协议。
这⼏个名词有⼀种通俗的解释:
通讯协议:双⽅对话的标准
通⽤的:⽤了都说好,谁⽤谁知道
⽆状态的:翻脸不认⼈
超⽂本:除了⽂本,还可以是⾳频、视频
HTTP协议与Android开发之间的关系:
HTTP协议的学习重点:
Http协议基础概念、
五大编程app
请求响应模型、
提交请求的不同⽅法、
响应状态判断、
获取响应以及解析响应、
数据下载的实现⽅法、
数据上传的实现⽅法、
请求头详细内容、
响应头详细内容等
关于http协议的学习,推荐两个链接:
⼆、http协议概念:
1、http协议定义:
WWW是以Internet作为传输媒介的⼀个应⽤系统,WWW⽹上基本的传输单位是Web⽹页。WWW的⼯作是基于客户机/服务器计算模型,由Web浏览器和Web服务器构成,两者之间采⽤超⽂本传输协议HTTP进⾏通信。
HTTP协议时基于TCP/IP协议之上的协议,是Web浏览器和Web服务器之间的应⽤层的协议,是通⽤的、⽆状态的⾯向对象的协议。
如果要实现⽹络互联我们要思考两个需要解决的技术问题:
第⼀:浏览器和服务器是通过什么来连接的。
第⼆:这种连接⽅式是怎么实现的。
通过Internet去发送到服务器当中,⽽Internet内部可以通过三种⽅式来实现发送信息和数据:
第⼀种:HTTP协议,也是在⼯作中最常⽤的,是建⽴在TCP/IP基础上实现的。
第⼆种:FTP协议
第三种:TCP/IP协议,它也是最底层的协议,其它的⽅式必须是要通过它,但是要想实现这种协议必须要实现socket编程,这种⽅法是⽤来上传⼀些⽐较⼤的⽂件,视频,进⾏断点续传的操作。
2、客户端连接服务器实现内部的原理如下:
分析上图,步骤如下:
第⼀步:在浏览器客户端中得到⽤户输⼊的内容。
第⼆步:浏览器得到这个⽹址之后,内部会将这个域名发送到DNS上,进⾏域名解析。得到它的IP之后就会链接到指定的服务器上,
假如服务器的地址是:221.104.13.32:80,从浏览器到服务器端⼝它使⽤到最底层的TCP/IP协议。
第三步:实现TCP/IP协议⽤Socket来完成,使⽤了Socket的套接字。
第四步:服务器端的80端⼝监听客户端的链接,这样客户端到服务器就链接上了。
服务器接收到这些内容之后,并按照这些请求的路径到对应的页⾯,进⼀步到对应的⽹页内容,返回给客户端。
通俗⼀点讲,⽤户在浏览器输⼊⽹址,通过http协议发出去,⽹址经过DNS域名解析,解析成指定的ip地址,并在80端⼝上监听⽤户的请求。服务器监听到请求之后,会以三种⽅式返回给客户端:HTML、XML、JASON。
HTTP返回请求数据的三种⽅式:
1、以HTML代码内容返回。
2、以XML字符串的形式返回,在以后的android开发中这种形式返回数据⽐较多。
3、以JSON对象形式返回,在⽹络流量上考虑JSON要⽐XML⽅式要好⼀些,便于解析。
在Android当中,⼀般使⽤xml和Json数据解析。
三、使⽤HTTP协议访问⽹络:
Android中的WebView控件已经在后台帮我们处理好了发送HTTP请求、接收服务响应、解析返回数据,以及最终的页⾯展⽰这⼏步⼯作,不过由于它封装得太好了,反⽽不能直观地看出HTTP协议是如何⼯作的。因此接下来我们通过⼿动发送HTTP请求的⽅式,来更加深⼊的了解这⼀过程。
在Android上发送HTTP请求的⽅式⼀般有两种:HttpURLConnection和HttpCient。我们先来学习HttpCient。
四、HttpCient:
HttpClient是Apache开源组织提供的HTTP⽹络访问接⼝(⼀个开源的项⽬),从名字上就可以看出,它是⼀个简单的HTTP客户端(并不是浏览器),可以发送HTTP请求,接受HTTP响应。但是不会缓存服务器的响应,不能执⾏HTTP页⾯中签⼊嵌⼊的JS代码,⾃然也不会对页⾯内容进⾏任何解析、处理,这些都是需要开发⼈员来完成的。
HttpClient其实是⼀个interface类型,HttpClient封装了对象需要执⾏的Http请求、⾝份验证、连接管理和其它特性。既然HttpClient是⼀个接⼝,因此⽆法创建它的实例。从⽂档上看,HttpClient有三个已
知的实现类分别是:AbstractHttpClient, AndroidHttpClient, DefaultHttpClient,会发现有⼀个专门为Android应⽤准备的实现类AndroidHttpClient,当然使⽤常规的DefaultHttpClient也可以实现功能。从两个类包所有在位置就可以看出区别,AndroidHttpClient定义在android.http.AndroidHttpClient包下,属于Android原⽣的http访问,⽽DefaultHttpClient定义在org.apache.http.impl.client.DefaultHttpClient包下,属于对apche项⽬的⽀持。⽽AndroidHttpClient没有公开的构造函数,只能通过静态⽅法newInstance()⽅法来获得AndroidHttpClient对象。
简单来说,⽤HttpClient发送请求、接收响应都很简单,只需要五⼤步骤即可:(要牢记)
创建代表客户端的HttpClient对象。
创建代表请求的对象,如果需要发送GET请求,则创建HttpGet对象,如果需要发送POST请求,则创建HttpPost对象。注:对于发送请求的参数,GET和POST使⽤的⽅式不同,GET⽅式可以使⽤拼接字符串的⽅式,把参数拼接在URL结尾;POST⽅式需要使⽤setEntity(HttpEntity entity)⽅法来设置请求参数。
调⽤HttpClient对象的execute(HttpUriRequest request)发送请求,执⾏该⽅法后,将获得服务器返回的HttpResponse对象。服务器发还给我们的数据就在这个HttpResponse相应当中。调⽤HttpResponse的对应⽅法获取服务器的响应头、响应内容等。
检查相应状态是否正常。服务器发给客户端的相应,有⼀个相应码:相应码为200,正常;相应码为404,客户端错误;相应码为505,服务器端错误。
获得相应对象当中的数据
五、DefaultHttpClient:
根据上⾯的五⼤步骤,我们就拿DefaultHttpClient举例来访问⽹络。注意这⾥有⼀条原则:在主线程中不能访问⽹络(在android4.0之后的加⼊的概念)。
【实例】点击按钮,获取百度⾸页的⽂本内容
新建⼯程⽂件m04_http01。完整版代码如下:
⾸先是布局⽂件,虽然⽐较简单,但还是贴上吧。
l代码如下:
<LinearLayout xmlns:android="schemas.android/apk/res/android"
xmlns:tools="schemas.android/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的代码如下:(注释⽐较详细)
ample.m04_http01;
2
3import org.apache.http.HttpEntity;
4import org.apache.http.HttpResponse;
5import org.apache.http.client.HttpClient;
6import org.apache.hods.HttpGet;
7import org.apache.http.impl.client.DefaultHttpClient;
8import org.apache.http.util.EntityUtils;
9import android.app.Activity;
10import android.os.Bundle;
11import android.os.Handler;
12import android.os.Message;
13import android.view.View;
14import android.view.View.OnClickListener;
15import android.widget.Button;
16import android.widget.TextView;
17
18public class MainActivity extends Activity {
19
20public static final int SHOW_RESPONSE = 0;
21
22private Button button_sendRequest;
23private TextView textView_response;
24
25//新建Handler的对象,在这⾥接收Message,然后更新TextView控件的内容
26private Handler handler = new Handler() {
27
28        @Override
29public void handleMessage(Message msg) {
30super.handleMessage(msg);
31switch (msg.what) {
32case SHOW_RESPONSE:
33                String response = (String) msg.obj;
34                textView_response.setText(response);
35break;
36
37default:
38break;
39            }
40        }
41
42    };
43
44    @Override
45protected void onCreate(Bundle savedInstanceState) {
47        setContentView(R.layout.activity_main);
48        textView_response = (TextView)findViewById(R.id.TextView1);
49        button_sendRequest = (Button)findViewById(R.id.button1);
50
51        button_sendRequest.setOnClickListener(new OnClickListener() {
52
53//点击按钮时,执⾏sendRequestWithHttpClient()⽅法⾥⾯的线程
54            @Override
55public void onClick(View v) {
56// TODO Auto-generated method stub
57                sendRequestWithHttpClient();
58            }
59        });
60    }
61
62//⽅法:发送⽹络请求,获取百度⾸页的数据。在⾥⾯开启线程
63private void sendRequestWithHttpClient() {
64new Thread(new Runnable() {
65
66            @Override
67public void run() {
68//⽤HttpClient发送请求,分为五步
69//第⼀步:创建HttpClient对象
70                HttpClient httpCient = new DefaultHttpClient();
71//第⼆步:创建代表请求的对象,参数是访问的服务器地址
72                HttpGet httpGet = new HttpGet("www.baidu");
73
74try {
75//第三步:执⾏请求,获取服务器发还的相应对象
76                    HttpResponse httpResponse = ute(httpGet);
77//第四步:检查相应的状态是否正常:检查状态码的值是200表⽰正常
78if (StatusLine().getStatusCode() == 200) {
79//第五步:从相应对象当中取出数据,放到entity当中
80                        HttpEntity entity = Entity();
81                        String response = String(entity,"utf-8");//将entity当中的数据转换为字符串
82
83//在⼦线程中将Message对象发出去
84                        Message message = new Message();
85                        message.what = SHOW_RESPONSE;
86                        message.obj = String();
87                        handler.sendMessage(message);
88                    }
89
90                } catch (Exception e) {
91// TODO Auto-generated catch block
92                    e.printStackTrace();
93                }
94
95            }
96        }).start();//这个start()⽅法不要忘记了
97
98    }
99 }
⼤致流程如下:
这⾥,我们添加了⼀个sendRequestWithHttpClient()⽅法(第63⾏),并在点击事件中去调⽤这个⽅法。在这个⽅法中,先开启了⼀个⼦线程。
69⾄81⾏:在⼦线程中使⽤HttpClient发出⼀条HTTP请求,请求的⽬标地址是百度的⾸页。
83⾄87⾏:为了能让结果在界⾯上显⽰出来,将服务器返回的数据放到了Message对象中,并⽤Handler将Message发出去。
需要注意的是:
第80⾏的entity就是服务器发还给客户端的数据。
最后要记得在清单⽂件中声明访问⽹络的权限:
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16"/>
<uses-permission android:name="android.permission.INTERNET"/>
程序运⾏后,点击按钮,显⽰结果如下:
服务器返回给我们的就是这种HTML代码,只是通常情况下浏览器都会将这些代码解析成漂亮的⽹页后再展⽰出来。
参考链接:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。