虽然在登录系统中使用了Web Service与服务端进行交互。但是在传递大量的数量时,Web Service显得有些笨拙。在本节将介绍移动电子相册中使用的另外一种与数据库交互的方法。直接发送HTTP GET或POST请求。这就要用到HttpGet、HttpPost以及HttpURLConnection这些类。

15.3.1  HttpGet类和HttpPost类

本节将介绍Android SDK集成的Apache HttpClient模块。要注意的是,这里的Apache HttpClient模块是HttpClient 4.0(org.apache.http.*),而不是Jakarta Commons HttpClient 3.x(org.apache.commons.httpclient.*)。

在HttpClient模块中用到了两个重要的类:HttpGet和HttpPost。这两个类分别用来提交HTTP GET和HTTP POST请求。为了测试本节的例子,需要先编写一个Servlet程序,用来接收HTTP GET和HTTP POST请求。读者也可以使用其他服务端的资源来测试本节的例子。

假设192.168.17.81是本机的IP,客户端可以通过如下的URL来访问服务端的资源:

http://192.168.17.81:8080/querybooks/QueryServlet?bookname=开发

在这里bookname是QueryServlet的请求参数,表示图书名,通过该参数来查询图书信息。

现在我们要通过HttpGet和HttpPost类向QueryServlet提交请求信息,并将返回结果显示在TextView组件中。

无论是使用HttpGet,还是使用HttpPost,都必须通过如下3步来访问HTTP资源。

1.创建HttpGet或HttpPost对象,将要请求的URL通过构造方法传入HttpGet或HttpPost对象。

2.使用DefaultHttpClient类的execute方法发送HTTP GET或HTTP POST请求,并返回HttpResponse对象。

3.通过HttpResponse接口的getEntity方法返回响应信息,并进行相应的处理。

如果使用HttpPost方法提交HTTP POST请求,还需要使用HttpPost类的setEntity方法设置请求参数。

本例使用了两个按钮来分别提交HTTP GET和HTTP POST请求,并从EditText组件中获得请求参数(bookname)值,最后将返回结果显示在TextView组件中。两个按钮共用一个onClick事件方法,代码如下:

public void onClick(View view)

{

//  读者需要将本例中的IP换成自己机器的IP

//服务器  :服务器项目  :servlet名称 

String url = "http://192.168.17.81:8080/querybooks/QueryServlet"; 

TextView tvQueryResult = (TextView) findViewById(R.id.tvQueryResult);

EditText etBookName = (EditText) findViewById(R.id.etBookName);

HttpResponse httpResponse = null;

try

{

switch (view.getId())

{

//  提交HTTP GET请求

//doGet():将参数的键值对附加在url后面来传递

case R.id.btnGetQuery:

//  向url添加请求参数

  url += "?bookname=" + etBookName.getText().toString();

//  第1步:创建HttpGet对象

//与HttpPost区别所在,这里是将参数在地址中传递 

HttpGet httpGet = new HttpGet(url);

//  第2步:使用execute方法发送HTTP 

GET请求,并返回HttpResponse对象

httpResponse = new DefaultHttpClient().execute(httpGet);

//  判断请求响应状态码,状态码为200表

示服务端成功响应了客户端的请求

if (httpResponse.getStatusLine().

getStatusCode() == 200)

{

//  第3步:使用getEntity方法获得返回结果

String result = EntityUtils.

toString(httpResponse.getEntity());

//  去掉返回结果中的"\r"字符,

否则会在结果字符串后面显示一个小方格

tvQueryResult.setText(result.replaceAll("\r", ""));

}

break;

//  提交HTTP POST请求

case R.id.btnPostQuery:

//  第1步:创建HttpPost对象

HttpPost httpPost = new HttpPost(url);

//  设置HTTP POST请求参数必须用NameValuePair对象

//与HttpGet区别所在,这里是将参数用List传递

List<NameValuePair> params = new 

ArrayList<NameValuePair>();

params.add(new BasicNameValuePair

("bookname", etBookName.getText(). toString()));

//  设置HTTP POST请求参数

httpPost.setEntity(new 

UrlEncodedFormEntity(params, HTTP.UTF_8));

//  第2步:使用execute方法发送HTTP 

POST请求,并返回HttpResponse对象

httpResponse = new DefaultHttpClient().

execute(httpPost);

if (httpResponse.getStatusLine().

getStatusCode() == 200)

{

//  第3步:使用getEntity方法获得返回结果

String result = EntityUtils.toString

(httpResponse.getEntity());

//  去掉返回结果中的"\r"字符,

否则会在结果字符串后面显示一个小方格

tvQueryResult.setText(result.replaceAll("\r", ""));

}

break;

}

}

catch (Exception e)

{

tvQueryResult.setText(e.getMessage());

}

 HttpGet和HttpPost的区别在于前者是将参数在地址中传递,后者是将参数用List传递。

本文参考与:http://hi.baidu.com/crazygit/item/702eef7a1fd0053e70442358

android 网络编程 HttpGet类和HttpPost类使用详解的更多相关文章

  1. iOS开发——网络编程Swift篇&(八)SwiftyJSON详解

    SwiftyJSON详解 最近看了一些网络请求的例子,发现Swift在解析JSON数据时特别别扭,总是要写一大堆的downcast(as?)和可选(Optional),看?号都看花了.随后发现了这个库 ...

  2. [C#]网络编程系列专题二:HTTP协议详解

    转自:http://www.cnblogs.com/zhili/archive/2012/08/18/2634475.html 我们在用Asp.net技术开发Web应用程序后,当用户在浏览器输入一个网 ...

  3. linux网络编程 ntohs, ntohl, htons,htonl inet_aton等详解

    ntohs =net to host short int 16位 htons=host to net short int 16位 ntohs =net to host long int 32位 hto ...

  4. iOS开发——网络编程Swift篇&(七)NSURLSession详解

    NSURLSession详解 // MARK: - /* 使用NSURLSessionDataTask加载数据 */ func sessionLoadData() { //创建NSURL对象 var ...

  5. 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

  6. Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

  7. Java 网络编程(四) InetAddress类

    链接地址:http://www.cnblogs.com/mengdd/archive/2013/03/09/2951895.html Java 网络编程(四) InetAddress类 InetAdd ...

  8. 转 Android网络编程之使用HttpClient批量上传文件 MultipartEntityBuilder

    请尊重他人的劳动成果,转载请注明出处:Android网络编程之使用HttpClient批量上传文件 http://www.tuicool.com/articles/Y7reYb 我曾在<Andr ...

  9. Android网络编程只局域网传输文件

    Android网络编程之局域网传输文件: 首先创建一个socket管理类,该类是传输文件的核心类,主要用来发送文件和接收文件 具体代码如下: package com.jiao.filesend; im ...

随机推荐

  1. css 中 position属性

    position属性详解 文档流 1.html中的布局方式分为三种: 标准流(顺序布局):因为html中的元素大体可以分为两大类(a:块级元素:div .H1-H6. table表格  有序级无序列表 ...

  2. python模块之时间模块

    一.time模块 表示时间的方式分为: 1时间戳(timestamp) 2格式化化的时间字符串(format string) 3结构化时间(struct_time) import time print ...

  3. ELK-6.5.3学习笔记–使用filebeat管理微服务日志

    微服务日志打印. 转载于http://www.eryajf.net/2369.html 上边是输出了nginx日志,从而进行展示,以及各种绘图分析,而现在的需求是,要将微服务当中的日志汇总到elk当中 ...

  4. Tensorflow搞一个聊天机器人

    catalogue . 前言 . 训练语料库 . 数据预处理 . 词汇转向量 . 训练 . 聊天机器人 - 验证效果 0. 前言 不是搞机器学习算法专业的,3个月前开始补了一些神经网络,卷积,神经网络 ...

  5. rancher使用fluentd-pilot收集日志分享

    fluentd-pilot简介 fluentd-pilot是阿里开源的docker日志收集工具,Github项目地址:https://github.com/AliyunContainerService ...

  6. @JsonIgnore注解可以实现不返回前端字段

    import com.fasterxml.jackson.annotation.JsonIgnore; /** * 密码 */ @JsonIgnore private String password;

  7. python 模块二(os,json,pickle)

    #################################总结##################### os常用 os.makedirs('baby/安哥拉/特斯拉/黄晓明') os.mkd ...

  8. 今天我们来聊聊svn的使用

    前言:作为一名码农,如果你告诉你的小伙伴你不会使用版本控制,那么你将会被小伙伴所鄙视,这个文章从区别带你领略他们的优缺点. (一)git和svn之间的区别 svn相当于是一个云存储,必须要借助网络,才 ...

  9. js监听键盘事件

    用JS监听键盘按下事件(keydown event)   1.监听全局键盘按下事件,例如监听全局回车事件 1 $(document).keydown(function(event){ 2 if(eve ...

  10. python中print和input的底层实现

    print print的底层通过sys.stdout.write() 实现 import sys print('hello') print('world') print(520) sys.stdout ...