目录
1. 什么是HTTP协议?
简介
- HTTP是HyperText Transfer Protocol(超文本传输协议),互联网应用最为广泛的网络协议,所有www文件都必须遵守HTTP协议
- HTTP协议最初的目的是提供发布和接收HTML页面的方法
- HTTP协议是应用层、面向对象的协议,是Web联网的基础,也是手机联网的常用协议之一
- HTTP协议是浏览器客户端和服务器端之间数据传输的格式规范
特点
- 支持B/S(浏览器/服务器端)及C/S(客户端/服务器端)模式
- 简单快速,客户端向服务器端请求服务时,只需要传输请求方法和路径
- 灵活,允许传输任意类型的对象
- 无状态协议,对事物处理没有记忆能力
- 客户端每发送一次请求都需要服务器回送响应,在请求结束后,回主动释放连接,建立连接到关闭连接的过程称为“一次连接”,HTTP连接使用的是“请求——响应”的方式
2. HTTP的工作方式
HTTP1.1增加了持久连接的支持。
3. 统一资源定位符——URL
学习URL之前,让我们了解一下 URI(统一资源标识符):
URI用来唯一地标识一个资源,可以标识任何类型的资源(本地系统资源、局域网资源、互联网资源),web上的可用的每种资源(如HTML文档、图像、视频、程序)都可以用一个URI来定位。
URL是 统一资源定位符,只能定义网络资源,所以属于 URI的子类 。具体结构如下图:
- http: : 表示网页使用的是HTTP协议
- host(主机名/域名):可以使用本地域名(如127.0.0.1),也可使用网络域名(如www.baidu.com)
- :port(端口号) :非必须,默认端口号为80
- path(路径):非必须,包括虚拟目录,文件名,参数部分和锚部分
4. 请求信息——Request
知道了HTTP协议是浏览器客户端
和服务器端
之间数据传输的格式规范
,但是这个规范中具体包含什么内容呢?我们要怎么查看这部分内容呢?我们可以通过软件将通讯的过程拦截下来,就可以查看到具体传递的信息了。浏览器客户端向服务器发送的数据,我们称为HTTP的请求信息——Request
。
我们在浏览器中输入网址后回车,这个操作就是浏览器客户端向服务器端发送请求信息。为了查看整个通讯的过程,在拦截时直接右键页面,点击检查。
找到Network栏后,再在地址栏回车,就可以在Network栏中看到浏览器向服务器端发送的多个请求。请求数据
包括请求行
、请求头
和 请求数据/实体内容
。
4.1 HTTP请求信息的组成
请求行
:包括请求方式(有8种)、请求资源(URI)和协议版本,格式如下:
请求头
:(以下信息,根据请求方式的不同而不全都存在)
- Accept:浏览器接受的数据类型
- Accept-Charset:浏览器接受的编码格式
- Accept-Encoding:浏览器接受的数据压缩格式
- Accept-Language:浏览器接受的语言
- Host:当前请求访问的目标地址(肯定存在)
- If-Modified-Since:浏览器最后的缓存时间
- Referer:当前请求来自哪里
- User-Agent:浏览器的类型
- Cookie:浏览器保存的cookie数据
- Connection:浏览器与服务器的连接状态
- Date:请求发出的时间
- …
请求数据/实体内容
:只有请求方式为POST时,提交的参数才会放到 请求数据/实体内容 中。
5. 响应信息——Response
服务器接收到客户端发来的请求后,会进行相应的处理,并向客户端输出信息,称为响应信息——Response
。包括响应行
、响应头
和响应体/实体内容
。
5.1 HTTP请求信息的组成
响应行
:包括协议版本、状态码和状态描述
常见的状态码:
- 1XX:指示信息——表示请求已被接收,据需处理;
- 2XX:成功——表示请求已被成功接收、理解、接收;
(200 OK 客户端请求成功) - 3XX:重定向——要完成请求必须进行更进一步的操作;
- 4XX:客户端错误——请求有语法错误或请求无法实现;
(400 Bad Request 客户端请求有语法错误,不能被服务器所理解,404 Not Found 请求资源不存在) - 5XX:服务器错误——服务器未能实现合法的请求;
(500 Internal Server Error 服务器发生不可预期的错误,503 Server Unavailable 服务器当前不能成立客户端的请求,一段时间后可能恢复正常)
响应头
:(以下信息,根据响应方式的不同而不全都存在)
- Location:表示重定向的地址
- Server:表示服务器的类型
- Content-Encoding:表示服务器发送给浏览器的数据压缩类型
- Content-Length:表示服务器发送给浏览器的数据长度
- Content-Language:表示服务器支持的语言
- Content-Type:表示服务器发送给浏览器的数据类型及内容编码
- Last-MoModified:表示服务器资源的最后修改时间
- Refresh:表示定时刷新
- Content-Disposition:表示告诉浏览器以下载的方式打开资源
- Connection:浏览器与服务器的连接状态
- …
响应体/实体内容
:服务器端向库互动传输的实际的数据信息,本质是一堆字节流,可表示文本、图片或其他格式的信息。
到这里我们就简单讲解了HTTP的理论知识,接下来看看如何运用吧。
6. HttpURLConnection
在java的java.net包中,有个HttpURLConnection
类实现而了访问HTTP协议的基本功能,这个类继承自URLConnection
,这两个类都是抽象类。URLConnection
类代表应用程序和URL之间的通信链接,用于读取/写入此URL引入的资源。简单来说它就是在我们应用程序和访问网络资源的URL之间形成通信的一个对象,通过这个对象就能读取/写入到指定的URL所指定的资源。HttpURLConnection
是URLConnection
的子类,用来读取/写入HttpURL所指定的资源,每个HttpURLConnection
用于生成单个请求。
HttpURLConnection
的使用步骤:
- 获取网址的URL,并将其转换为URL类对象( new URL(url) )
- 打开URL连接( URL.openConnection()方法 )
- 建立HttpURLConneciton连接,获取HttpURLConneciton对象
- 设置连接参数
- 读取/写入具体内容
接下里我们来看一个获取网络图片的例子,实现步骤如下:
- 首先,我们编写一个布局(一个用于显示图片的ImageView、一个用于点击获取网络图片的Button),并在MainActivity中绑定初始化这些控件:
activity_main.xml
<?xml version="1.0" encoding="utf-8"