android网络与通信编程

HTTP协议

超文本传输协议HTTP)是一种应用协议用于分布式,协作,超媒体信息系统。[1] HTTP是万维网数据通信的基础,超文本文档包括指向用户可以轻松访问的其他资源的超链接,例如,通过单击鼠标或在Web浏览器中点击屏幕。

——wiki

HTTP 完整流程:

  1. 浏览器向服务器发送一个 HTTP 格式的 request
  2. 服务器处理 request,向浏览器返回一个 Http 格式的 response
  3. 重复1、2步,请求其他资源

以谷歌学术https://patents.google.com/为例,下面代码做了简化处理

Request Header

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
:authority: patents.google.com
:method: GET
:path: /
:scheme: https
accept:
accept-encoding:
accept-language:
cache-control:
cookie:
sec-fetch-dest:
sec-fetch-mode:
sec-fetch-site:
sec-fetch-user:
upgrade-insecure-requests:
user-agent:
x-client-data:

1:浏览器发出请求

请求头包括

方法:GET还是POSTGET仅请求资源,POST会附带用户数据

路径:/

HTTP报文头报文头:accept:包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息

其他相关Header

Cache-Control :缓存控制

如以下设置,相当于让服务端将对应请求返回的响应内容不要在客户端缓存:

如果是POST,那么请求还包括一个Body,包含用户数据

2:服务器发出响应

Response Header

1
2
3
4
5
6
7
8
9
10
11
12
13
14
alt-svc: 
quic=":443";
cache-control: private
content-encoding: gzip
content-length: 1429
content-type: text/html
date:
expires:
set-cookie:
status:
x-content-type-options:
x-frame-options:
x-frontend-version:
x-xss-protection:

响应报文比请求报文相多了一个“响应状态码”,它表示浏览器请求的处理结果

响应代码有:

  • 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
2
3
4
GET /path HTTP
Header1: Value1
Header2: Value2
Header3: Value3

HTTP POST格式:

1
2
3
4
5
6
POST /path HTTP
Header1: Value1
Header2: Value2
Header3: Value3

body data goes here...

HTTP响应的格式:

1
2
3
4
5
6
200 OK
Header1: Value1
Header2: Value2
Header3: Value3

body data goes here...

注意\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个步骤:

  1. 获取到 HttpUrlConnection 对象
  2. 进行全局的网络设置并建立 Http 连接
  3. 进行数据处理
  4. 关闭连接

HttpClient

  1. 创建HttpClient对象。
  2. 创建对应的发送请求的对象,如果需要发送GET请求,则创建HttpGet对象,如果需要发送POST请求,则创建HttpPost对象。
  3. 对于发送请求的参数,GET和POST使用的方式不同,GET方式可以使用拼接字符串的方式,把参数拼接在URL结尾;POST方式需要使用setEntity(HttpEntity entity)方法来设置请求参数。
  4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,执行该方法返回一个HttpResponse对象。
  5. 调用HttpResponse的对应方法获取服务器的响应头、响应内容等。