HTTP协议
超文本传输协议(HTTP)是一种应用协议用于分布式,协作,超媒体信息系统。[1] HTTP是万维网数据通信的基础,超文本文档包括指向用户可以轻松访问的其他资源的超链接,例如,通过单击鼠标或在Web浏览器中点击屏幕。
——wiki
HTTP 完整流程:
- 浏览器向服务器发送一个 HTTP 格式的 request
- 服务器处理 request,向浏览器返回一个 Http 格式的 response
- 重复1、2步,请求其他资源
以谷歌学术https://patents.google.com/
为例,下面代码做了简化处理
Request Header
1 | :authority: patents.google.com |
1:浏览器发出请求
请求头包括
方法:GET
还是POST
,GET
仅请求资源,POST
会附带用户数据
路径:/
HTTP报文头报文头:accept:
包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息
其他相关Header
Cache-Control :缓存控制
如以下设置,相当于让服务端将对应请求返回的响应内容不要在客户端缓存:
如果是POST,那么请求还包括一个Body,包含用户数据
2:服务器发出响应
Response Header
1 | alt-svc: |
响应报文比请求报文相多了一个“响应状态码”,它表示浏览器请求的处理结果
响应代码有:
200
表示成功3xx
表示重定向,4xx
表示客户端发送的请求有错误5xx
表示服务器端处理时发生了错误
响应类型:Content-Type: text/html
表示响应类型是HTML文本
其他的Header
步骤3:如果浏览器还需要继续向服务器请求其他资源,比如图片,就再次发出HTTP请求,重复步骤1、2
详细属性见developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers
HTTP GET格式:
1 | GET /path HTTP |
HTTP POST格式:
1 | POST /path HTTP |
HTTP响应的格式:
1 | 200 OK |
注意\r\n\r\n
分隔header 和 body
url 统一资源定位符
说完了方法,再来说一下url : http通过统一资源定位器(URL)标识HTTP资源
来自 wiki
比如http://example.com:5000/path/me.html?key1=value1&key2=value2
名称 | 含义 |
---|---|
http:// |
是协议 |
example.com |
域名 |
5000 |
端口号 |
path/me.html |
资源的路径 |
?key1=value1&key2=value2 |
额外参数(用 & 符号分隔的键/值对) |
整个访问过程是,url通过http协议发出去,DNS服务器把域名解析为对应ip地址,服务器在5000端口上监听用户的请求,当监听到请求之后,返回数据给客户端
HTTP特点
- 支持bs和cs
- 简单:只需传送方法和路径
- 灵活:允许传输任意类型数据对象
- 无连接: 限制每次连接只处理一个请求;服务器处理完请求,并收到应答后,即断开连接
- 无状态: 协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态
Android网络接口
Android平台有三种网络接口可以使用,他们分别是:java.net.*(标准Java接口),org.apache(Apache接口),和android.net.(android网络接口) ; android.net. 实际上是通过对 Apache 的 HttpClient 的封装来实现的一个 HTTP 编程接口
HttpURLConnection
使用 HttpUrlConnection 来进行网络请求大致上可以分为4个步骤:
- 获取到 HttpUrlConnection 对象
- 进行全局的网络设置并建立 Http 连接
- 进行数据处理
- 关闭连接
HttpClient
- 创建HttpClient对象。
- 创建对应的发送请求的对象,如果需要发送GET请求,则创建HttpGet对象,如果需要发送POST请求,则创建HttpPost对象。
- 对于发送请求的参数,GET和POST使用的方式不同,GET方式可以使用拼接字符串的方式,把参数拼接在URL结尾;POST方式需要使用setEntity(HttpEntity entity)方法来设置请求参数。
- 调用HttpClient对象的execute(HttpUriRequest request)发送请求,执行该方法返回一个HttpResponse对象。
- 调用HttpResponse的对应方法获取服务器的响应头、响应内容等。