网络的基本概念及Http协议
网络的基本知识
IP地址和端口号
- IP地址:每台计算机都必须有一个唯一的IP地址作为标识,由“.”分隔的十进制数组成
- 端口号:采用端口号标识计算机上正在运行的进程
- 每个被发送的网络数据包括都包含端口号
网络协议
HTTP协议
- 属于应用层的面向对象的协议,适用于分布式超媒体信息系统
- 主要特点
支持C/S模式
简单快捷:只需传送请求方法和路径
灵活:允许传输任意类型的数据对象
无连接:限制每次连接只处理一个请求
无状态“:对事务处理没有记忆功能 - HTTP的URL的格式:
http://host[:port][/path]
http表示要通过HTTP协议来定位网络资源; host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用默认端口80;path指定请求资源的URL - HTTP请求报文
请求行,请求报头,空行,请求数据 - HTTP响应报文
状态行,消息报头,空行,响应正文
常见状态码
200 OK:客户请求成功
400 Bad Request:客户端请求有语法错误,不能被服务器所理解
401 Unauthorized :请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden:服务器收到请求,但是拒绝提供服务
404 Not Found:服务器无法根据客户端的请求找到资源
500 Internal Server Error:服务器发生不可预期的错误
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常
https请求
HTTP安全版
HTTPS = HTTP + SSL/TLS
HTTPS的安全基础是SSL
请求过程
网络编程
Http通信方式
- HttpURLConnection
Android 2.3之后,HttpURLConnection是Android网络编程的最佳选择,它的API简单,体积较小,压缩和缓存机制有效较少网络访问的流量 - HttpClient
- Socket通信方式
Android的Https
- 自定义X509TrustManager
1.在使用HttpsURLConnection发起HTTPS请求的时候,提供了一个定义的X509TrusManager,未实现安全逻辑
2.如果不提供定义X509TrustManager,代码运行起来可能会报异常 - 自定义HostnameVerifier
1.在握手期间,如果URL的主机和服务器的标识主机名不匹配,则验证机制可以回调此接口的实现程序来确定是否应该允许此连接。URL类
- 统一资源定位符(URL)是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。
- 互联网上的每个文件都要一个唯一的URL
- URL类提供了多个构造器用于创建URL对象
- URL类提供多个方法访问URL对应的资源:
1.URLConnection openConnection():返回一个URLConnection对象,它表示到URL所有用的远程对象的连接。
2.InputStream openStream():打开此URL的连接,并返回一个用于读取该URL资源的InputStream
Android URL通信
Android HTTP URL接口的基本操作包括:
- 创建URL以及HttpURLConnection对象
- 连接参数设置
- 连接到服务器
- 向服务器写数据
- 从服务器读取数据
HttpURLConnection访问HTTP资源的步骤:
1.根据URL地址创建URL对象
2.使用URL对象的openConnection()方法获取HttpURLConnection对象
3.设置连接的属性,包括GET/POST请求方式
4.输入、输出数据
5.关闭输入、输出流
6.在AndroidManifest配置文件中设置访问INTERNET的权限
HttpURLConnection使用的注意事项
1.使用setConnectionTimeout()方法设置连接超时,当网络不好时,Android Q系统会在超过设置时间后收回资源,中断操作
2.通过getResponseCode()对响应码进行判断,如果返回的响应码为200,则表示连接成功
3.对大文件操作时,将文件写到SDCard上,不要直接写到手机内存上
4.操作大文件时,要一边从网络上读取,一边往SDcard上写,减少手机内存的使用
5.对文件流操作完毕后要及时关闭
6.Android4.0后所有的网络通信的操作都不能在主线程上进行,要用独立的线程完成
常用的网络编程框架
Android常用的网络编程框架
Volley:
1.Google官方推出的异步请求库,支持HTTPClient、HttpURLConnection
2.基于网络队列,适合小数据频繁通信,请求线程池默认为4
OkHttp:
1.高性能的http库,支持同步、异步,而且支持http2、websocket协议,api简洁易用,实现了http缓存
2.Android网络访问的源码已用OkHttp代替了HttpURLConnection
Retrofit:
1.基于OkHttp封装的一套RESTful网络请求框架,底层默认采用okHttp
目前网络框架最好选择:RxJava + Retrofit + OkHttp
OkHttp
配置:
- OkHttp支持Android 2.3及其以上版本,Java要求1.7以上
- 添加依赖:implementation ‘com.squareup.okhttp3:okhttp:4.2.1’
- 添加权限: < uses-permission android : name= “android.permission.INTERNET”/ >
特点:
- OKHttp是Android版http客户端,非常高效,支持SPDY、连接池、GZIP和HTTP缓存
- 默认情况下,OKHttp会自动处理常见的网络问题,像二次连接、SSL的握手问题
- 如果应用城西继承了OKHttp,Retrofit默认会使用OKHttp处理其他网络层请求
- 从Android4.4开始,HttpURLConnection的底层实现采用okHttp
OkHttp开发基本思路
OkHttp的每次网络请求是一个Request,提供Request必要的参数url、header等,基于Request构造出一个Call对象,在调用它的execute()方法,就能取得Web Server回复的数据
如果同步调用,需要在独立的线程中执行,使用异步调用,则采用回调的方式执行,在内部封装了一个请求队列
OkHttp依赖另一个组件okio完成高性能的I/O操作
基本用法:
1.新建一个OkHttpClient对象
2.通过Request.Builder对象新建一个Request对象
3.通过Request对象构造Call对象,调用enqueue()以异步的方式将call加入调度队列,等待reqeuest执行完成
4.通过Call对象的Callback对象返回执行结果
Get同步请求
- 当HTTP响应码位于200到300之间时,认为操作是成功的
- response.body()返回一个ResponseBody对象,封装了HTTP响应的主体数据,它的String()方法将这些数据转换为字符串,另一个byteStream()方法则返回一个InputStream流
- 注意事项
1.需要独立的线程中执行网络操作
2.对于超过1MB的响应body,应使用留的方式来处理
body - 一般不适用
Get异步请求
在另外的工作线程中执行http请求,请求时不会阻塞当前的线程,所以可以再Android主线程中使用
异步请求需要加入到一个请求队列中,并且要指定回调方法
Http Header的读写
当写请求头的时候,使用header(name,value)可以设置唯一的name、value。如果已经有值,旧的将会被移除,然后添加新的
使用addHeader(name,value)可以添加多值(添加,不移除已经有的)
post异步请求
通过RequestBody构建请求数据
Post方式提交Multipart文件
MultiparBuilder可以构建复杂的HTTP Request Body,这与HTML文件上传形式兼容
多块请求体中每块请求都是一个请求体,可以定义自己的请求Header,如设定Content-Disposition
如果Content-Length和Content-Type可用的话,他们会被自动添加到请求Headers中
图片加载框Glide
- Glide是由Google开源的一个图片加载库,是快速高效的Android开源媒体管理和图像加载框架
- 它将媒体解码、内存和磁盘缓存一级资源池包装成简单易用的界面
- 添加依赖
implementation ‘com.github.bumptech.glide:4.10.0’
annotationProcessor ‘com.github.bumptech.glide:compiler:4.10.0’
//http图片处理
implementation “com.github.bumptech.glide:okhttp3-integration:4.10.0” - 添加网络权限
< uses-permission android:name = “android.permission.INTERNET” / > - 使用
- 加载图片的一般方法:Glide.with(Context context).load(Strint url).into(ImageView imageView);
Glide集成OkHttp加载http图片
1.导入依赖
2.创建支持https的OKHttpClient对象
3.创建继承AppGlideModule类的自定义类,重写registerComponents()方法
4.使用时,用GlideApp替代Glide类