HTTP 完全解析

Http 详解

HTTP 的定义

HTTP即是:Hypertext Transfer Protocol,超文本传输协议,⼀种⽹络传输协议,位于 TCP / IP 协议族的最顶层——应⽤层

URL

说到HTTP,不得不说URL,URL(统一资源定位符)是URI(统一资源标识符)的一个子集,用来标识网络上某一资源的位置。
URL格式:
三部分:协议类型、服务器地址(和端⼝号)、路径(Path)
也即是:协议类型://服务器地址[:端⼝号]路径

HTTP报文格式

请求报文:
在这里插入图片描述
请求报文分为三部分:请求行、请求头、请求体
请求行:方法类型:路径 Http版本
请求头:主机地址,内容编码、内容长度、Cookie等
请求体:请求携带的参数,GET请求会携带在URL后面(有长度限制),POST请求稍微复杂,后面会将到

响应报文:
在这里插入图片描述
同样,响应报文也分为三部分:状态行、响应头、返回内容

Request Method 请求⽅法

HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
实际对Android开发来说,常用的方法就是GET和POST,这里主要对这两种请求方法做讲解

GET请求
  • 用途:⽤用于获取资源
  • 对服务器器数据不进⾏修改
  • 不发送 Body
//Android中发起一个GET请求,对应 Retrofit 的代码:
@GET("/users/{id}")
Call<User> getUser(@Path("id") String id);
POST请求
  • ⽤用于增加或修改资源
  • 发送给服务器器的数据带在body里面
//Android开发中 对应 Retrofit 的代码:
@FormUrlEncoded	
@POST("/users/update")
Call<User> addUser(@Field("name") String name;
HEAD

和 GET 使⽤用⽅方法完全相同
和 GET 唯⼀一区别在于,返回的响应中没有 Body

Status Code 状态码

当收到服务器响应的时候,会给我们带过来一个状态码
三位数字,⽤用于对响应结果做出类型化描述(如获取成功、内容未找到等等)。这里列表一些常用的标准状态码

  • 1xx:临时性消息。如:100 (继续发送)、101(正在切换协议)
  • 2xx:成功。最典型的是 200(OK)、201(创建成功)。
  • 3xx:重定向。如 301(永久移动)、302(暂时移动)、304(内容未改变)。
  • 4xx:客户端错误。如 400(客户端请求错误)、401(认证失败)、403(被禁⽌止)、404(找不不到内容)。
  • 5xx:服务器器错误。如 500(服务器器内部错误)。
Header中的Content-Type

指定 请求报文或者响应报文中Body 的类型。主要有四类:

  1. text/html
  2. x-www-form-urlencoded
  3. multitype/form-data
  4. application/json , image/jpeg , application/zip 等

1、text/html类型
请求 Web ⻚⾯是返回响应的类型,Body 中返回 html ⽂本。格式如下:

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 1111
<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
......

2、x-www-form-urlencoded
Web ⻚⾯纯⽂本表单的提交⽅式
在这里插入图片描述
3、multitype/form-data
Web ⻚⾯含有⼆进制⽂件时的提交⽅式
格式如下:

  POST /users HTTP/1.1
Host: api.github.com
Content-Type: multipart/form-data; boundary=----
WebKitFormBoundary7MDofjOjejdljXiqP
Content-Length: 8838
------WebKitFormBoundary77MDofjOjejdljXiqP
Content-Disposition: form-data; name="name"
nyc
------WebKitFormBoundary7MDofjOjejdljXiqP
Content-Disposition: form-data; name="header"; filename="header.jpg"
Content-Type: image/jpeg
JeOdiosfewjosfDSJofoodSODFosfd......
------WebKitFormBoundary7MDofjOjejdljXiqP--
//对应 Retrofit 的代码:
@Multipart
@POST("/users/update")
Call<User> addUser(@Part("name") RequestBody name, @Part("header")
RequestBody header);

//构造请求
RequestBody namePart = RequestBody.create(MediaType.parse("text/plain"),
nameStr);
RequestBody headerPart = RequestBody.create(MediaType.parse("image/jpeg"),
headerFile);
api.addUser(namePart, headerPart);

4、application/json , image/jpeg , application/zip
单项内容(⽂本或⾮⽂本都可以),⽤于 Web Api 的响应或者 POST / PUT 的请求或者GET请求

//请求中提交 JSON
POST /users HTTP/1.1
Host: hencoder.com
Content-Type: application/json; charset=utf-8
Content-Length: 288
{"name":"nyc"}
对应 Retrofit 的代码:
@POST("/users/update")
Call<User> addUser(@Body("user") User user);
api.addUser(user);

//响应中返回 JSON
HTTP/1.1 200 OK
content-type: application/json; charset=utf-8
content-length: 234
[{"login":"mojombo","id":1,"node_id":"MDQ6VXNl
cjE=","header_url":"https://profile.csdnimg.cn/0/5/F/1_weixin_46055193""......
header中的Content-Length

指定 Body 的⻓度(字节)。
Transfer: chunked (分块传输编码 Chunked Transfer Encoding)
⽤于当响应发起时,内容⻓度还没能确定的情况下。和 Content-Length 不同时使⽤。⽤途是尽早给
出响应,减少⽤户等待。

Header中的User-Agent

⽤户代理,即是谁实际发送请求、接受响应的,例如⼿机浏览器、某款⼿机 App.

Header中的Range / Accept-Range

按范围取数据Accept-Range: bytes 响应报⽂中出现,表示服务器⽀持按字节来取范围数据
Range: bytes=- 请求报⽂中出现,表示要取哪段数据
Content-Range:-/total 响应报⽂中出现,表示发送的是哪段数据
作⽤:断点续传、多线程下载

Cache

作⽤:缓存数据以降低从服务器取数据的频率,以加快响应速度和提⾼⽹络使用率

其他Headers

Accept: 客户端能接受的数据类型。如 text/html
Accept-Charset: 客户端接受的字符集。如 utf-8
Accept-Encoding: 客户端接受的压缩编码类型。如 gzip
Content-Encoding:压缩类型。如 gzip

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值