Android与互联网交互的三种方式
- 上传数据:使用GET/POST上传数据、图片、文本、视频、音频、XML、JSON,调用WebService数据
- 下载数据:下载网络中的数据、图片、文本、视频、音频、XML、JSON,调用WebService数据
- 浏览数据:通过WebView浏览网页
Http协议
1.什么是Http协议?
Http协议时TCP/IP协议的一个应用层协议,用于定义客户端与web服务器之间通讯的格式。
2.Http协议的底层工作流程
两个名词:
- SYN:TCP/IP建立连接时的握手信号。
- ACK:确认字符,确认发过来的数据已经接收无误。
TCP/IP三次握手
- 客户端发送syn包(syn = j)到服务器,进入SYN_SEND状态,然后等待服务器确认
- 服务器收到syn包,确认客户的syn(ack = j + 1),同时在自己也发送一个SYN包(syn=k), 即SYN + ACK包,服务器进入SYN_RECV状态
- 客户端收到SYN + ACK包,向服务器发送确认包ACK(ack = k +1),发送完毕后,客户端与服务端 进入ESTABLISHED状态,完成三次握手,然后两者开始传送数据
请求方式
- GET
- POST
- HEAD
- PUT
- DELETE
- TRACE
- CONNECT
- OPTIONS
GET与POST对比
- GET:在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&分割,但数据容量通常不能超过2k,比如:http://xxx?username=…&pawd=…这种就是GET
- POST:这个则可以在请求的实体内容中向服务器发送数据,数据容量没有限制
- 注意:这两个玩意儿都是发送数据的,只是发送机制不一样。GET的安全性很低,POST的比较高,一般我们查询数据时使用GET,增删改的时候使用POST。
HTTP协议的特点
- 支持客户/服务器模式
- 简单快速
- 灵活
- 无连接
- 无状态
Android HTTP请求方式:HttpURLConnection
介绍
安卓4.4版本 HttpURLConnection已被替换成OkHttp了
使用步骤
- 创建一个URL对象: URL url = new URL(http://www.baidu.com);
- 调用URL对象的openConnection( )来获取HttpURLConnection对象实例:HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- 设置HTTP请求使用的方法:GET或者POST,或者其他请求方式比如:PUT conn.setRequestMethod(“GET”);
- 设置连接超时,读取超时的毫秒数,以及服务器希望得到的一些消息头 conn.setConnectTimeout(6*1000); conn.setReadTimeout(6 * 1000);
- 调用getInputStream()方法获得服务器返回的输入流,然后输入流进行读取了 InputStream in = conn.getInputStream();
- 最后调用disconnect()方法将HTTP连接关掉 conn.disconnect();
Android HTTP请求方式:HttpClient
介绍
已弃用!
使用步骤
GET请求:
1. 创建HttpClient对象:HttpClient httpClient = new DefaultHttpClient();
2. HttpGet httpGet = new HttpGet("http://www.baidu.com");
3. httpClient.execute(httpGet);
POST请求:
1. 创建HttpClient对象:HttpClient httpClient = new DefaultHttpClient();
2. 创建一个 HttpPost 对象:HttpPost httpPost = new HttpPost("http://www.baidu.com");
3. 通过一个 NameValuePair 集合来存放待提交的参数
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username", "admin"));
params.add(new BasicNameValuePair("password", "123456"));
4. 将这个参数集合传入到一个UrlEncodedFormEntity中
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, "utf-8");
5.调用 HttpPost的 setEntity()方法将构建好的 UrlEncodedFormEntity传入
6.httpClient.execute(httpPost);