http协议

1 HTTP通信传输

http是应用层的传输协议,依赖于传输层的TCP协议。
在这里插入图片描述

客户端输入URL回车,DNS解析域名得到服务器的IP地址,服务器在80端口监听客户端请求,端口通过TCP/IP协议(可以通过Socket实现)建立连接。HTTP属于TCP/IP模型中的运用层协议,所以通信的过程其实是对应数据的入栈和出栈。报文从运用层传送到运输层,运输层通过TCP三次握手和服务器建立连接,四次挥手释放连接。

  • http请求包括:请求行、请求头、请求体
  • http响应包括:响应行、响应头、响应体

2 HTTP请求报文

HTTP请求报文由3部分组成(请求行+请求头+请求体)

  • 请求行和请求头加起来叫Header!
  • 请求体又叫消息正文或实体(body)

get请求没有请求体!
在这里插入图片描述

2.1 请求行

例如:POST /chapter17/user.html HTTP/1.1
格式:请求方式 资源路径 协议/版本
请求行必须在http请求格式的第一行。

get请求:

  • 将请求参数追加在url后面,不安全
  • url长度限制get请求方式数据的大小
  • 没有请求体!!!!
  • 一般的HTTP请求大多都是GET。

post请求:

  • 请求参数在请求体处,较安全。
  • 请求数据大小没有显示
  • 只有表单设置为method=“post”才是post请求,其他都是get请求

2.2 请求头

例如:Host: 39.108.107.149:8080

请求头从第二行开始,到第一个空格结束。请求头和请求体之间存在一个空格(如下)

POST http://39.108.107.149:8080/vk/app/rest/ddp/iModelServiceImpl/findModelByType HTTP/1.1
User-Agent: Fiddler
Host: 39.108.107.149:8080
Content-Length: 11
   
name=城市  #这不再是请求头,而是请求体。上面有空行

请求头通常以键值对{key:value}方式传递数据。
key为规范的固定值。
value为key对应的取值,通常是一个值,可能是一组。

常见请求头属性(key):

1、Host:要请求的服务器主机名

2、Accept:告诉服务端,该请求所能支持的响应数据类型,专业术语称为MIME 类型(文件类型的一种描述方式)
如:

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

MIME格式:大类型/小类型[;参数]
例如:

  • text/html,html文件
  • text/css,css文件
  • text/javascript,js文件
  • image/*,所有图片文件

3、if-Modified-Sincce:浏览器通知服务器,本地缓存的最后变更时间。与另一个响应头组合控制浏览器页面的缓存

4、Cokkie:客户端的Cookie就是通过这个报文头属性传给服务端的
5、User-Agent:浏览器通知服务器,客户端浏览器与操作系统相关信息
6、Connection:表示客户端与服务连接类型;Keep-Alive表示持久连接,close已关闭
7、Referer:表示这个请求是从哪个url跳过来的,通过百度来搜索淘宝网,那么在进入淘宝网的请求报文中,Referer的值就是:www.baidu.com。如果是直接访问就不会有这个头。
8、Content-Length:请求体的长度。(客户端发送的请求体的长度)
9、Content-Type:请求的与请求体对应的MIME信息。如果是post请求,会有这个头,默认值为application/x-www-form-urlencoded,表示请求体内容使用url编码。
10、Accept-Encoding:浏览器通知服务器,浏览器支持的数据压缩格式。如GZIP压缩。
11、Accept-Language:浏览器通知服务器,浏览器支持的语言。各国语言(国际化i18n)
12、Cache-Control:指定请求和响应遵循的缓存机制。

其他更多请求头属性参考其他文章。

2.3 请求体

当请求方式是post的时,请求体会有请求的参数,格式如下:

username=zhangsan&password=123

如:

POST http://39.108.107.149:8080/vk/app/rest/ddp/iModelServiceImpl/findModelByType HTTP/1.1
User-Agent: Fiddler
Host: 39.108.107.149:8080
Content-Length: 20
content-type: application/x-www-form-urlencoded
     
name=城市&status=1   #请求体(url编码)

3 HTTP响应报文

HTTP的响应报文也由三部分组成(响应行+响应头+响应体)
在这里插入图片描述

示例:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=E1352C5CCEAD7EA9A6F8DA253395781C; Path=/vk
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 26 Sep 2018 03:24:59 GMT
//此处有空格
{"sessionToken":null,"code":"1","msg":null,"service":"iModelServiceImpl","method":"findModelByType","key":null,"paras":{},"result":{"pageInfo":{"pageNum":1,"numPerPage":20,"totalCount":28,"pageNumShown":2,"startNum":0,"endNum":20}

3.1响应行:

报文协议及版本以及状态码和状态描述。
如:

HTTP/1.1 200 OK

状态码:由3位数字组成,第一个数字定义了响应的类别

1xx:指示信息,表示请求已接收,继续处理
2xx:成功,表示请求已被成功接受,处理。

  • 200 OK:客户端请求成功
  • 204 No Content:无内容。服务器成功处理,但未返回内容。一般用在只是客户端向服务器发送信息,而服务器不用向客户端返回什么信息的情况。不会刷新页面。
  • 206 Partial Content:服务器已经完成了部分GET请求(客户端进行了范围请求)。响应报文中包含Content-Range指定范围的实体内容

3xx:重定向

  • 301 Moved Permanently:永久重定向,表示请求的资源已经永久的搬到了其他位置。
  • 302 Found:临时重定向,表示请求的资源临时搬到了其他位置
  • 303 See Other:临时重定向,应使用GET定向获取请求资源。303功能与302一样,区别只是303明确客户端应该使用GET访问
  • 307 Temporary Redirect:临时重定向,和302有着相同含义。POST不会变成GET
  • 304 Not Modified:表示客户端发送附带条件的请求(GET方法请求报文中的IF…)时,条件不满足。返回304时,不包含任何响应主体。虽然304被划分在3XX,但和重定向一毛钱关系都没有

4xx:客户端错误

  • 400 Bad Request:客户端请求有语法错误,服务器无法理解。
  • 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
  • 403 Forbidden:服务器收到请求,但是拒绝提供服务
  • 404 Not Found:请求资源不存在。比如,输入了错误的url
  • 415 Unsupported media type:不支持的媒体类型

5xx:服务器端错误,服务器未能实现合法的请求。

  • 500 Internal Server Error:服务器发生不可预期的错误。
  • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,

3.2 响应头

响应头也是用键值对k:v
服务器通过响应头来控制浏览器的行为,不同的头浏览器操作不同

常见请求头描述
Location指定响应的路径,需要与状态码302配合使用,完成跳转。
Content-Type响应正文的类型(MIME类型)
Content-Disposition通过浏览器以下载方式解析正文
Set-Cookie与会话相关技术。服务器向浏览器写入cookie
Content-Encoding服务器使用的压缩格式
Content-length响应正文的长度
Refresh定时刷新,格式:秒数;url=路径。url可省略,默认值为当前页。
Server指的是服务器名称
Last-Modified服务器通知浏览器,文件的最后修改时间。
Cache-Control响应输出到客户端后,服务端通过该报文头属告诉客户端如何控制响应内容的缓存。常见的取值有常见的取值有private、public、no-cache、max-age,no-store,默认为private。缓存时间为31536000秒(365天)

更多请求头属性可以参考其他文章。

Content-Type详解:
常见的Content-Type:
(以发请求为例)

Content-Type解释
text/htmlhtml格式
text/plain纯文本格式
text/cssCSS格式
text/javascriptjs格式
image/gifgif图片格式
image/jpegjpg图片格式
image/pngpng图片格式
application/x-www-form-urlencodedPOST专用:普通的表单提交默认是通过这种方式。form表单数据被编码为key/value格式发送到服务器。
application/jsonPOST专用:用来告诉服务端消息主体是序列化后的 JSON 字符串
text/xmlPOST专用:发送xml数据
multipart/form-dataPOST专用:下面讲解

1、application/x-www-form-urlencoded
最常见的post提交数据的方式。浏览器原生的form表单,如果不设置enctype属性,那么最终就会以application/x-www-form-urlencoded 方式提交数据。

示例:(使用postman为客户端)

POST http://39.108.107.149:8080/vk/app/rest/ddp/iModelServiceImpl/findModelByType HTTP/1.1
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
Postman-Token: 8e602802-b4f5-4d05-96d7-e1c7a1951719
User-Agent: PostmanRuntime/7.1.1
Accept: */*
Host: 39.108.107.149:8080
cookie: JSESSIONID=6CD80B7028062D9190717CEE001C3194
accept-encoding: gzip, deflate
content-length: 32
Connection: keep-alive
     
name=%E5%9F%8E%E5%B8%82&status=1
  • 首先,Content-Type 被指定为 application/x-www-form-urlencoded;其次,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。大部分服务端语言都对这种方式有很好的支持。

  • 很多时候,我们用 Ajax 提交数据时,也是使用这种方式。例如 JQuery 和 QWrap 的 Ajax,Content-Type 默认「application/x-www-form-urlencoded;charset=utf-8」。

2、multipart/form-data

这又是一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让 form 的 enctyped 等于这个值。(postman中只需要选择一下就可以了)
在这里插入图片描述
生成了一个 boundary 用于分割不同的字段,为了避免与正文内容重复,boundary 很长很复杂。然后 Content-Type 里指明了body数据是以 mutipart/form-data 来编码,本次请求的 boundary 是什么内容。

3、application/json
application/json 这个 Content-Type 作为响应头大家肯定不陌生。**实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。**由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。 JSON 格式支持比键值对复杂得多的结构化数据,这一点也很有用。

3.3 响应体

服务器发送给浏览器的正文,即我们真正要的“干货” ;
响应体是服务器回写给客户端的页面正文,浏览器将正文加载到内存,然后解析渲染 ,显示页面内容。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值