Android 网络编程(特别是 Http 请求)是 Android 学习中比较重要的内容,也是 Android 开发中比较常用的内。虽然已经有很多优秀的第三方开源框架供我们使用,也大大提升了我们的开发效率,但是也因此我们对基本 Http 请求的并不熟悉,我们应该重视基础,从底层去了解网络请求的实现机制。此篇博客总结了 Android 两种基本的网络请求方式,并通过一个简单的 Demo 进行实践。
Android 网络编程注意事项
- 安卓的耗时操作(如 I/O 流操作)的逻辑不能写在主线程,必须写在子线程。
- 子线程在安卓 2.3 以后不能更新 UI 界面(更新就报错),子线程想要更新界面必须结合 Handler 或者 AsyncTask 等才可以。
- Android 网络操作均需添加网络访问权限:
|
|
说明事项
以下代码中的 GET 请求都是对博主博客的一个 404 页面发送的请求,会返回该页面的 html 代码,POST 请求都是对博主服务器上的一个用户注册 API 接口发送的请求,其中请求参数包括用户名和密码,如果服务器中的数据库已经存在此账号则会返回一个 exist,如果注册成功则会返回一个 success,否则返回一个 error。
HttpURLConnection
HttpURLConnection 类位于 java.net 包中,用于发送 HTTP 请求和获取 HTTP 响应。该类是抽象类,不能直接实例化,要使用URL的 openConnection() 方法获得。
发送 GET 请求
|
|
GET 方法在传递中文参数时,会产生乱码,要进行 Base64 编码来解决乱码问题。
|
|
发送 POST 请求
|
|
HttpClient
对于比较复杂的联网操作,使用 HttpUrlConnection 就不一定能够满足要求,此时,可以使用 Apache 组织提供的 HttpClient 项目来实现。HttpClient 中将 HttpUrlConnection 类中的输入/输出流操作统一封装成 HttpGet、HttpPost 和 HttpResponse 类。其中 HttpGet 类代表发送 GET 请求、HttpPost 代表发送 POST 请求、HttpResponse 类代表处理响应的对象。
发送 GET 请求
- 使用流程
创建 HttpClient 对象
创建 HttpGet 对象
如需添加参数,可以在 url 中添加参数,也可调用 HttpGet 的 setParams() 方法来添加请求参数。
调用 HttpClient 对象的 execute() 方法发送请求。
调用 HttpResponse 的 getEntity() 方法获得包含服务器响应内容的 HttpEntity 对象。
- 使用示例
|
|
发送 POST 请求
- 使用流程
创建 HttpClient 对象
创建 HttpGet 对象
调用 HttpPost 的 setParams() 方法来添加请求参数,也可调用 setEntity() 方法来设置请求参数。
调用 HttpClient 对象的 execute() 方法发送请求。
调用 HttpResponse 的 getEntity() 方法获得包含服务器响应内容的 HttpEntity 对象。
- 使用示例:
|
|
简单的 Demo
通过在 MainActivity 中使用子线程分别调用以上四个方法来发送 Http 请求,并通过 Handler 在子线程和主线程之间传递消息,通知主线程更新 UI,以此来测试所写的方法是否可行。
|
|