虽然在登录系统中使用了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. diff和patch

    diff -u:the unified format会将不同的地方放在一起,紧凑易读 . diff original.txt updated.txt c表示在original文件中的m,n行的内容将要 ...

  2. Go结构体

    当我们要表示同一种数据类型时候,可以用到数组,切片和字典. 当我们要表示不同的数据类型呢?这时候就要用到结构体了 一:定义struct 关键字 type 和 struct 来定义结构体 type st ...

  3. 这3周以来的面试总结(C#/.net 智能硬件/物联网)

    2017.3找工作面试记录-第一周 2017.3找工作面试记录-第一周(2) 2017.3找工作面试记录-第二周 2017.4找工作面试记录-第三周 2017.4找工作面试记录-第三周(2)--金蝶 ...

  4. zookeeper 介绍与集群安装

    zookeeper 介绍 ZooKeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization). ...

  5. 【.NET】using 语句中使用的类型必须可隐式转换为"System.IDisposable"

    #问题: 在使用EF开发中,出现如下错误:“using 语句中使用的类型必须可隐式转换为“System.IDisposable” #原因: 项目中没有引用 EntityFramework 这个程序集: ...

  6. window.location.reload();页面实现跳转和刷新

    1 history.go(0)2 location.reload()3 location=location4 location.assign(location)5 document.execComma ...

  7. GC ROOT

    (GC Root有哪些) 基本思想是通过一系列称为“GC roots”的对象作为起始点,可以作为根节点的是: 虚拟机栈(栈帧中的本地变量表)中引用的对象(即所有Java线程当前活跃的栈帧里指向GC堆里 ...

  8. ssh 跳板机部署

    1.首先创建存放日志的文件夹并开放读写权限       mkdir /var/log/jump/       chmod -R 777 /var/log/jump/   2.将原有ssh程序修改为另外 ...

  9. Django多表操作

    多表创建 创建模型 下面通过一个简单的图书管理系统,来阐述多表的创建和查询操作 在视图函数里里定义如下代码 from django.db import models class Book(models ...

  10. SQL Server进阶(十)事务和并发处理

    1 https://www.cnblogs.com/edisonchou/p/6129717.html