Http基础
Android平台手机应用开发技术培训 高级.第7讲
学习目标:
目标学员:
课程时长:45分钟
有JAVA语言基础的开发者或在校计
算机相关专业大学生
学习并了解Android中的联网框架。
掌握基本的http联网技巧。
HTTP基础知识
Android的联网框架
包摘要
HttpURLConnection简介
课程目录
综合演练
Http协议
超文本传输协议
(HTTP,HyperText Transfer Protocol)
是客户端浏览器或其他程序与Web服务器
之间的应用层通信协议。也是互联网上应
用最为广泛的一种网络协议。
HTTP协议的特点
简单快捷:客户向服务器请示服务时,只需传送请求方法和路径。
灵活:允许传输任意类型的数据对象。
无连接:每次连接只处理一个请求,应答后即断开。
无状态:指协议对于事务处理没有记忆能力。
Http协议
HTTP工作原理
首先客户端与服务器需要建立连接。
然后客户端发送一个请求给服务器。
服务器接到请求后给予相应的应答。
客户端接收服务器返回的信息。
客户端与服务器断开连接。
Http协议
HTTP/协议中共定义了八种方法(有时也叫“动作”)来表明Request-URI
指定的资源的不同操作方式:
OPTIONS HEAD GET POST
PUT DELETE TRACE CONNECT
HTTP服务器至少应该实现GET和HEAD方法,其他方法都是可选的。
GET主要用于获取信息,POST主要用于发送信息。
GET传送的数据量较小,不能大于2KB(这主要是因为受URL长度限制)。
POST传送的数据量较大,一般被默认为不受限制。但理论上,限制取决于
服务器的处理能力。
GET安全性较低,POST安全性较高。
Http协议
每个HTTP请求或HTTP应答都有一个头部数据(Header)
每个头部数据包含一个或多个字段
字段与字段间采用CRLF(回车换行符,“\r\n”)分隔
利用头部数据可以实现有条件的请求或应答
下面的示范是一个GET请求的头部数据:
HTTP应答的结构与请求相似,只是第一行不同:
200是状态码,由3位数字组成,表示请求是否被理解或被满足。
GET / HTTP/
Accept:*/*
Content-type:text/html
Content-length:2873
HTTP/ 200 OK
Http协议
每个HTTP请求或HTTP应答都有一个可选的消息体数据(Body)
消息体数据是传输的数据实体
请求消息体数据和响应消息体数据都是由开始行,消息报头(可选的),空行
(只有CTLF的行),消息正文(可选的)组成
下面的示范是一个完整的应答:
从<html>部分开始,就是消息体。
HTTP/ 200 OK
Content-Type: text/html
Content-Length: 37
<html><body>hello world</body></html>
HTTP基础知识
Android的联网框架
包摘要
HttpURLConnection简介
课程目录
综合演练
Android的联网框架
Android系统对网络通讯的支持是非常丰富的:
不仅兼容Java语言中的包,
还提供了Android平台所独有的包。
此外还提供更加强大的包它在java开源项目中被广泛使用。
包
主要提供了在Java下访问HTTP,Socket及Datagram协议的基本功能。
使用时基本只能通过同步的方式与网络交互。
同时,使用该框架需要具备的基本知识。
包(HttpClient)
它是一个使用非常广泛的Apache开源项目。
它弥补了 灵活性不足的缺点,为客户端的HTTP编程提供了高效、最
新、功能丰富的工具包支持。
Android引入HttpClient的同时还对它的一些封装和扩展,例如设置缺省的
HTTP超时和缓存大小等。
包
用于增强Android的网络访问功能,
在的基础上提供了:
Wi-Fi设备管理,
SSL(Secure Sockets Layer,安全套接层)的支持,
HTTP请求队列管理, 及HTTP连接池管理的功能,
在Android手机上获取DHCP信息,并创建Socket服务。
Android的联网框架
基础知识
Android的联网框架
包摘要
HttpURLConnection简介
课程目录
综合演练
包摘要
URI
表示一个统一资源标识符 (URI) 引用。
URL
代表一个统一资源定位符,它是指向互联网“资源”的指针。
URLDecoder
URL编码格式的解码工具类。
URLEncoder
URL编码格式的编码工具类。
Socket
此类实现客户端套接字(也可以就叫“套接字”)
DatagramSocket
此类表示用来发送和接收数据报包的套接字。
Proxy
此类表示代理设置,通常为类型(http、socks)和套接字地址。
包摘要
HttpURLConnection
支持 HTTP特定功能的URLConnection,主要使用它来进行联网操作。
CookieHandler
cookie管理器,它提供一种回调机制将 HTTP 状态管理策略实现挂钩到
HTTP 协议处理程序。简单的说,它帮助我们处理cookie。
CacheRequest
表示在ResponseCache中存储资源的通道。
CacheResponse
表示从ResponseCache获取资源的通道。
基础知识
Android的联网框架
包摘要
HttpURLConnection简介
课程目录
综合演练
HttpURLConnection摘要
disconnect()
指示近期服务器不太可能有其他请求(关闭套接字)。
getErrorStream()
如果连接失败但服务器仍然发送了有用数据,则返回错误流。
getFollowRedirects()
是否应该自动执行HTTP重定向。
getHeaderField(int n)
返回第n个头字段的值。
getHeaderFieldDate(String name, long Default)
返回解析为日期的指定字段的值。
getHeaderFieldKey(int n)
返回第n个头字段的Key。
getInstanceFollowRedirects()
此HttpURLConnection实例是否自动执行HTTP重定向。
HttpURLConnection摘要
getRequestMethod()
获取请求方法。
getResponseCode()
从HTTP响应消息获取状态码。
getResponseMessage()
获取与来自服务器的响应代码一起返回的HTTP响应消息(如果有)。
setFollowRedirects(boolean set)
设置是否应该自动执行HTTP重定向。
setInstanceFollowRedirects(boolean followRedirects)
设置此HttpURLConnection实例是否应该自动执行HTTP重定向。
setRequestMethod(String method)
设置请求方法,一般是GET或POST,也可以是HTTP支持的其他方法。
usingProxy()
指示连接是否通过代理。
HttpURLConnection的使用
创建HttpURLConnection的实例
这里要小心Android的一个BUG。反复发送请求,服务器有可能偶尔会返回状
态码为-1的应答包(-1不是符合HTTP协议的有效状态码)。
可以在使用HttpURLConnection之前,调用以下代码来修复这个BUG。
设置连接参数
URL url = new URL(“”);
HttpURLConnection connection =
(HttpURLConnection)();
("", "false");
(10000);
("User-Agent",
"Mozilla/ (compatible; MSIE ;)");
HttpURLConnection的使用
连接到服务器
向服务器写数据(POST需要写入数据,GET不需要)
从服务器读取数据
关闭数据流
();
OutputStream outStream = ();
(data,0,);
();
();
();
InputStream in = ();
基础知识
Android的联网框架
包摘要
HttpURLConnection简介
课程目录
综合演练
综合演练
本次演练将分别使用HttpURLConnection的GET和POST方法,去完成一次远
程访问,并展示其结果。
演练使用了互联网上一个公开,免费的手机号
码归属地查询的Web API。它同时提供了GET
和POST方式的访问支持。
创建项目HttpTest,并且制作本例的软件界面
(见右图,一个文本编辑框,两个按钮以及一
个用来显示结果的文本框)。
综合演练
需要在中为访问HTTP功能增加如下权限
在中为两个按钮增加点击事件,分别调用
GET或POST的测试方法
<uses-permission android:name=
""></uses-permission>
String ret = testGet(().toString());
("GET方式:\n\n" + ret);
String ret = testPost(().toString());
("POST方式:\n\n" + ret);
综合演练
手机归属地查询API简述:
调用地址:
url 参数:
m: 手机号码;
output: 输出格式。可选 xml、json、text(文本格式)。
callback: 回调函数名称(可选)。
使用GET时只要访问如下形式的URL即可(m的值是要查询的手机号):
使用POST方式时,需要把“m=13903111234&output=text”这段文本的数据发
送到如下的地址:
综合演练
GET方法摘要
使用HttpURLConnection前,要确保调用下例代码,以修正Android的BUG,
不论GET还是POST方法。。
HTTP头信息的设置,需要在调用connect之前,这里我们没有做特殊设置。
调用connect连接服务器后,需要先判断其ResoponseCode(状态码)。
如果得到状态码200则表示成功,接下来就可以使用getInputStream 方法打
开一个输入流,读取数据,最后别忘了关闭输入流。
("", "false");
(true);
int statusCode = ();
综合演练
POST方法摘要
在调用connect之前,需要进行如下设置:
POST必须指定Content-Type为application/x-www-form-urlencoded(默认)
或者multipart/form-data(一般在上传非ASCII字符的文本或文件时用)。
调用connect之后,需要先调用getOutputStream方法获得OutputStream,将
需要上传的内容上传完毕,然后的过程,就跟GET过程一样了。
(true);
(true);
("Content-Type",
"application/x-www-form-urlencoded");
//" multipart/form-data");
综合演练
最终,我们可以分别通过GET和
POST方法调用手机归属地查询
的Web API,然后将调用结果显
示出来了。
总结
HTTP的基础知识
Android中的HTTP框架
HttpURLConnection的使用
本课程到此结束,谢谢!