(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
一、HTTP协议初探:
HTTP(Hypertext Transfer Protocol)中文 “超文本传输协议”,是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议,是Internet上目前使用最广泛的应用层协议,它基于传输层的TCP协议进行通信,HTTP协议是通用的、无状态的协议。

这几个名词有一种通俗的解释:
- 通讯协议:双方对话的标准
- 通用的:用了都说好,谁用谁知道
- 无状态的:翻脸不认人
- 超文本:除了文本,还可以是音频、视频
HTTP协议与Android开发之间的关系:

HTTP协议的学习重点:
- Http协议基础概念、
- 请求响应模型、
- 提交请求的不同方法、
- 响应状态判断、
- 获取响应以及解析响应、
- 数据下载的实现方法、
- 数据上传的实现方法、
- 请求头详细内容、
- 响应头详细内容等
关于http协议的学习,推荐两个链接:
http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html
http://blog.csdn.net/gueter/article/details/1524447
1、http协议定义:
- 第一:浏览器和服务器是通过什么来连接的。
- 第二:这种连接方式是怎么实现的。
- 第一种:HTTP协议,也是在工作中最常用的,是建立在TCP/IP基础上实现的。
- 第二种:FTP协议
- 第三种:TCP/IP协议,它也是最底层的协议,其它的方式必须是要通过它,但是要想实现这种协议必须要实现socket编程,这种方法是用来上传一些比较大的文件,视频,进行断点续传的操作。


- 第一步:在浏览器客户端中得到用户输入的内容。
- 第二步:浏览器得到这个网址之后,内部会将这个域名发送到DNS上,进行域名解析。得到它的IP之后就会链接到指定的服务器上,假如服务器的地址是:221.104.13.32:80,从浏览器到服务器端口它使用到最底层的TCP/IP协议。
- 第三步:实现TCP/IP协议用Socket来完成,使用了Socket的套接字。
- 第四步:服务器端的80端口监听客户端的链接,这样客户端到服务器就链接上了。
- 服务器接收到这些内容之后,并按照这些请求的路径找到对应的页面,进一步找到对应的网页内容,返回给客户端。
- 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代码,自然也不会对页面内 容进行任何解析、处理,这些都是需要开发人员来完成的。
现在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发送请求、接收响应都很简单,只需要五大步骤即可:(要牢记)
- 创建代表客户端的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。完整版代码如下:
首先是布局文件,虽然比较简单,但还是贴上吧。
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的代码如下:(注释比较详细)

1 package com.example.m04_http01;
2
3 import org.apache.http.HttpEntity;
4 import org.apache.http.HttpResponse;
5 import org.apache.http.client.HttpClient;
6 import org.apache.http.client.methods.HttpGet;
7 import org.apache.http.impl.client.DefaultHttpClient;
8 import org.apache.http.util.EntityUtils;
9 import android.app.Activity;
10 import android.os.Bundle;
11 import android.os.Handler;
12 import android.os.Message;
13 import android.view.View;
14 import android.view.View.OnClickListener;
15 import android.widget.Button;
16 import android.widget.TextView;
17
18 public class MainActivity extends Activity {
19
20 public static final int SHOW_RESPONSE = 0;
21
22 private Button button_sendRequest;
23 private TextView textView_response;
24
25 //新建Handler的对象,在这里接收Message,然后更新TextView控件的内容
26 private Handler handler = new Handler() {
27
28 @Override
29 public void handleMessage(Message msg) {
30 super.handleMessage(msg);
31 switch (msg.what) {
32 case SHOW_RESPONSE:
33 String response = (String) msg.obj;
34 textView_response.setText(response);
35 break;
36
37 default:
38 break;
39 }
40 }
41
42 };
43
44 @Override
45 protected void onCreate(Bundle savedInstanceState) {
46 super.onCreate(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
55 public void onClick(View v) {
56 // TODO Auto-generated method stub
57 sendRequestWithHttpClient();
58 }
59 });
60 }
61
62 //方法:发送网络请求,获取百度首页的数据。在里面开启线程
63 private void sendRequestWithHttpClient() {
64 new Thread(new Runnable() {
65
66 @Override
67 public void run() {
68 //用HttpClient发送请求,分为五步
69 //第一步:创建HttpClient对象
70 HttpClient httpCient = new DefaultHttpClient();
71 //第二步:创建代表请求的对象,参数是访问的服务器地址
72 HttpGet httpGet = new HttpGet("http://www.baidu.com");
73
74 try {
75 //第三步:执行请求,获取服务器发还的相应对象
76 HttpResponse httpResponse = httpCient.execute(httpGet);
77 //第四步:检查相应的状态是否正常:检查状态码的值是200表示正常
78 if (httpResponse.getStatusLine().getStatusCode() == 200) {
79 //第五步:从相应对象当中取出数据,放到entity当中
80 HttpEntity entity = httpResponse.getEntity();
81 String response = EntityUtils.toString(entity,"utf-8");//将entity当中的数据转换为字符串
82
83 //在子线程中将Message对象发出去
84 Message message = new Message();
85 message.what = SHOW_RESPONSE;
86 message.obj = response.toString();
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代码,只是通常情况下浏览器都会将这些代码解析成漂亮的网页后再展示出来。
参考链接:
http://www.cnblogs.com/plokmju/p/Android_apacheHttpClient.html
(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)的更多相关文章
- 【JAVA】通过HttpClient发送HTTP请求的方法
HttpClient介绍 HttpClient 不是一个浏览器.它是一个客户端的 HTTP 通信实现库.HttpClient的目标是发 送和接收HTTP 报文.HttpClient不会去缓存内容,执行 ...
- Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- (三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)
文章来源:http://www.cnblogs.com/smyhvae/p/4006009.html 一.GET和POST的对比: 在漫长的时间当中,其他的方法逐渐的退出了历史舞台,最常用的只剩下GE ...
- Httpclient发送json请求
一.Httpclient发送json请求 public String RequestJsonPost(String url){ String strresponse = null; try ...
- .net core使用HttpClient发送代理请求_程序内抓包_Fiddler抓包
前言: 通过Fiddler抓取浏览器请求数据,相信大家已经都会用了,我们知道Fiddler是通过在本机计算器添加一个默认的代理服务器来实现的抓包数据的,端口号为:8888. 其实当我们打开Fiddl ...
- jmeter 发送http请求,并把获取到的请求的订单信息保存到文件中
有一个任务,需要频繁发送订单请求,并分析订单请求中有没有存在重复订单号,思路是用jmeter 发送http请求,使用正则表达式获取到订单号,并把订单号和线程号作为参数提供给java请求,在java请求 ...
- java httpclient发送json 请求 ,go服务端接收
/***java客户端发送http请求*/package com.xx.httptest; /** * Created by yq on 16/6/27. */ import java.io.IOEx ...
- 使用HttpClient发送HTTPS请求以及配置Tomcat支持SSL
这里使用的是HttpComponents-Client-4.1.2 package com.jadyer.util; import java.io.File; import java.io.FileI ...
随机推荐
- Python 第二篇:python字符串、列表和字典的基本操作方法
本文基于python 3.5.1 python常见的数据类型有字串.列表.元组.字典等,本文将详细介绍每一种数据类型的操作方法. 一:str字串的操作方法: 1.capitalize()--> ...
- python pyfits
原链接:http://blog.sina.com.cn/s/blog_a046022d0101a48h.html,全文复制以备出错. 导入pyfits模块:import pyfits ...
- HDU Wolf and Rabbit
Description There is a hill with n holes around. The holes are signed from 0 to n-1. A rabbit must h ...
- BZOJ 1257: [CQOI2007]余数之和sum( 数论 )
n >= k 部分对答案的贡献为 k * (n - k) n < k 部分贡献为 ∑ (k - ⌊k / i⌋ * i) = ∑ , ⌊k / i⌋ 相等的数是连续的一段, 此时这段连 ...
- Learning Web
1.UDACITY https://www.udacity.com/course/cs258
- Research notes for Scientific Writing
Noun. complacency n. 自得;自鸣得意 nomenclature n. 专业术语:e.g. the nomenclature of music; 音乐的专门术语 Verb. abs ...
- IntelliJ Idea 经常使用快捷键列表
Alt+回车 导入包,自己主动修正Ctrl+N 查找类Ctrl+Shift+N 查找文件Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导入的类和包Alt+Insert 生成代码(如 ...
- Spring通过工厂创建实例的注意事项
假设第三方(or别的team)提供一个工厂类(此类是不能够改动的.往往以jar包形式提供的),须要供给我们项目来使用. 可是我们自己的项目使用了spring来配置,所以我们当然希望可以通过spring ...
- MVC控制器里面使用dynamic和ExpandoObject
MVC控制器里面使用dynamic和ExpandoObject 在很多时候,我们在数据库里面定义表字段和实际在页面中展示的内容,往往是不太匹配的,页面数据可能是多个表数据的综合体,因此除了我们在表设计 ...
- 水平线、垂直线——axure线框图部件库介绍
1. 将水平线.垂直线拖动到axure页面编辑区域,如图: 2. 水平线.垂直线相关属性设置 主要属性有.线条的颜色.粗细.线条的样式.箭头的样式 来自:非原型不设计