天天看点

Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

【正文】

在前两篇文章中,我们学习到了和http相关的基础知识。文章链接如下:

<a href="http://www.cnblogs.com/smyhvae/p/4004983.html" target="_blank">android系列之网络(一)----使用httpclient发送http请求(通过get方法获取数据)</a>

<a href="http://www.cnblogs.com/smyhvae/p/4005034.html" target="_blank">android系列之网络(二)----http请求头与响应头</a>

一、get和post的对比:

在漫长的时间当中,其他的方法逐渐的退出了历史舞台,最常用的只剩下get和post方法。而之前已经讲过了通过get方法获取数据,今天来学习一下如何分别通过get和post获取数据。

举个例子:get类似于明信片,只有请求头,没有请求体。而post类似于一封信,信封上的内容为请求头;信里面的内容为请求体(请求头和请求体是分开的)。

含义如下:

get:通过请求uri得到资源。一般用于获取/查询资源信息。

post:用于向服务器提交新的内容。一般用于更新资源信息。

主要区别如下:

get方法主要用于从服务器取回数据,post用于向服务器提交数据

get类似于明信片,只有请求头,没有请求体;post类似于一封信,信封上的内容为请求头;信里面的内容为请求体

使用get方法啊向服务器i教的数据量较小,通常不超过2k,使用post向服务器提交的数据量通常没有限制(明信片不能多写,而写信可以写好多内容咧)

get请求是将所要提交的数据附在url之后,而post请求是将提交的数据放置在请求体当中

老罗在将到get和post请求的时候, 是这样说的:

1、get是从服务器上获取数据,post是向服务器传送数据。

2、在客户端, get方式在通过url提交数据,数据在url中可以看到;post方式,数据放置在html header内提交

3、对于get方式,服务器端用request.querystring获取变量的值,对于post方式,服务器端用request.form获取提交的数据。

4、get方式提交的数据最多只能有1024字节,而post则没有此限制

5、安全性问题。正如在(2)中提到,使用 get 的时候,参数会显示在地址栏上,而 post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get ;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好

啰嗦了这么多,对这段来个总结吧。

 【总结】

get/post请求的区别:

get请求方式:显式请求方式,请求参数会在url上显示,相对快,安全性较低,请求数据的大小一般不超过1kb。

post请求方式:隐式请求方式,请求参数将会在http请求的实体内容中进行传输,相对慢,安全性较高 ,请求数据的大小没有限制

注:get请求方式和post请求区别在于请求参数在传递的过程中方式不同。

二、url的定义和组成:

url:uniform resource locator 统一资源定位符

url的组成部分:以http://www.mbalib.com/china/index.htm为例

http://:代表超文本传输协议

www:代表一个万维网服务器

mbalib.com/:服务器的域名,或服务器名称

china/:子目录,类似于我们的文件夹

index.htm:是文件夹中的一个文件

/china/index.htm统称为url路径

三、使用tomcat软件在本地搭建服务器:

有了这个服务器,就相当于在本地的计算机有了一个网站,然后我们可以通过浏览器来访问这个网站。

下载之后,将压缩包解压:

Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

注意目录名不能有中文和空格。

软件运行之前要保证环境变量已经配置:

Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

上图中,变量名为java_home,变量值为:jdk安装的绝对路径。

回到tomcat的bin目录中, 双击startup.bat:

Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

之后弹出如下界面:

Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

这个时候,本地的服务器就已经搭建起来了。

首先查看自己电脑的ip地址,我的计算机的ip地址为:192.168.1.112。

在浏览器中输入http://192.168.1.112:8080/。如果弹出如下界面,表示tomcat安装成功并且启动起来了:

Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

上方图片中,显示我的tomcat的版本为:8.0.14。它的版本号是跟着jdk的版本走的,所以,建议jdk的版本为1.8。

我们现在在浏览器上测试一下它吧:

首先在d:\apache-tomcat-8.0.14\webapps\root目录中新建一个jsp文件:

Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

jsp文件中填入如下内容:

Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)
Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

现在我们随便起一个用户名和密码的账号,比如用户名smyhvae,密码为smyh,然后在浏览器中输入如下内容:

http://192.168.1.112:8080/test.jsp?name=smyhvae&amp;password=smyh

输入这个链接之后,回车,出现如下界面:

Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

上图中表示,我们向服务器发送这样一个请求,链接中,问号前面的内容代表请求的路径,问号后面是我们要传送的参数(键是固定不变的,值是用户自己填写的),然后服务器返还给我们这样的数据。

四、使用get方法向服务器发送数据:

我们在博客“android系列之网络(一)”中其实就已经通过get方法向服务器获取数据了,只不过那篇文章中是访问百度首页,然后获取百度首页的数据。现在我们要通过同样的get方法,只不过是换成了获取本地服务器搭建的网站数据。

只需要稍微修改一下那篇文章中的代码(代码结构一样,只是换了另外一个链接)。完整版代码如下:

activity_main.xml:

Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)
Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

mainactivity.java的代码如下:

Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)
Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

上方代码中,第73行就是我们所放入的url链接。运行程序后,输入用户名密码,可以看到在后台打印出了我们所输入的用户名和密码:

Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

五、使用post方法向服务器发送数据:

上一段中,我们是通过get方法向服务器发送数据,现在通过post方法向服务器发送数据。布局文件的代码不变,就不写了。mainactivity.java的代码如下:

Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)
Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

上方代码中,我们新开一个子线程,使用post方法向服务器发送用户名、密码等数据。我们之前已经知道,使用get方法发送http请求有五大步骤,而如今换成post方法时,需要在第二步和第三步之间加入一些步骤(即上方加粗部分的代码:116-127行),多的步骤其实是往请求对象中加入请求体。现在来详细解释一下这部分代码:

我们通过namevaluepair集合来存放待提交的参数,并将这个参数集合传入到一个urlencodedformentity当中(这个类的对象就代表了一个请求体,即键值对),然后将请求体放置在请求对象httppost当中。

程序运行后,输入用户名和密码,点击按钮,在后台打印出了之前输入的用户名密码:

Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

现在我们总结一下post提交数据的步骤:

1. 构造请求对象;

2. 将需要传递给服务器端的数据放置在键值对对象当中;

3. 将准备好的键值对放置在list当中;

4. 生成代表请求体的对象;

5. 将存有请求键值对的list对象放置在请求题对象当中;

6. 将请求体对象放置到请求对象当中;

7. 发送请求对象

后面的步骤(即处理请求对象)和get方法是一致的。

上面两段的例子,都是通过get和post往服务器发送数据(在此,二者的作用是等价的)。需要注意的是,一般来讲,get是从服务器取数据,但在此例子中get却是往服务器发数据。如果是上传文件,就必须用post。我们将在今后的章节中讲到。

继续阅读