JavaWeb~搞定基础HTTP协议相关的内容(URL、格式、方法、状态码、Header)

理解HTTP协议的用途

  • 操作系统内利用TCP和IP协议将数据信息进行客户端和服务器的互相传输 但并不是传送到就行 还需要对其进行客户端协议的解析让用户知道信息的内容是什么
  • 所以HTTP是应用层协议
  • 就好比我们买手机 快递公司和卖家只负责将新手机送到用户手里就行了 但是对于用户这就够了吗? 显然是不够的 还需要手机的说明书来方便我们去体验手机
  • 所以,我们把数据从A端传送到B端, TCP/IP 解决的是快递公司的功能,而两端还要对数据进行加工处理或者使用,所以我们还需要一层协议,不关心通信细节,关心应用细节
  • 虽然我们说, 应用层协议是我们程序猿自己定的.
  • 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议)就是其中之一

全双工与半双工

  • 全双工: 双向通信 借助一个socket对象 既可以发送数据 还可以接受数据
  • 半双工: 单向通信 要么只能读 要么只能写
  • TCP就是一个全双工通信 而 HTTP协议就是基于TCP而来的

初识URL

  • 平时我们俗称的 “网址” 其实就是说的 URL
  • 我以我的一篇博客的网址简单讲解
    在这里插入图片描述
    在这里插入图片描述

初识urlencode和urldecode

  • 首先看个例子
    在这里插入图片描述
  • 但是如果我们将网址复制出来就会成这样
    在这里插入图片描述
  • 上面的过程就是一个urlencode过程 那反过来就是一个urldecode过程
  • 那为什么要这样呢?
    因为像 / ? : 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现.比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义.
  • 转义的规则如下:
    将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY
    格式

HTTP协议格式

  • 为了方便理解课借助fiddler抓包工具进行抓包练习学习

HTTP请求格式

首行: [方法] + [URL] + [版本]
Header(协议头): 请求的属性, 冒号加空格分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个ContentLength属性来标识Body的长度;
在这里插入图片描述
在这里插入图片描述

HTTP响应格式

首行: [版本号] + [状态码] + [状态码解释]
Header: 请求的属性, 冒号加空格分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个ContentLength属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在body中.
在这里插入图片描述
在这里插入图片描述

HTTP的方法

( 1)GET方法:获取资源
GET方法是用来请求URL指定的资源。指定资源经服务器端解析后返回响应内容。

(2)POST方法:传输实体主题
POST方法用来传输实体的主体

(3)PUT方法:传输文件
PUT方法用来传输文件。像FTP协议的文件上传一样,要求在请求报文主体中包含文件的内容,然后保存到请求URL指定的位置。不太常用。

(4)HEAD方法:获取报文首部
HEAD方法和GET方法一样,只是不返回报文主体部分。用于确认URL的有效性及资源更新的日期时间等。

(5)DELETE方法:删除文件
DELETE方法用来删除文件,是PUT的相反方法。DELETE方法按请求URL删除指定的资源。也不常用。

(6)OPTIONS方法:询问支持的方法
OPTIONS方法用来查询针对请求URL指定的资源支持的方法。

  • GET与POST的区别
    唯一区别就是GET一般将数据放到URL中 POST一般将数据放到BODY中
    所以关于网上一些其他说法比如 get是用于服务器获取资源 POST是用于给服务器提交资源 还有get传输的数量较小POST传输的数量较大 这是设计者的初衷 但是发展到如今2020年这些早就不是问题了 目前最新版本的HTTP协议的URL可以达到几个M 虽然还是没有POST的大 但是足够了
    还有一些说post安全 其实不然 这只是对小白而言 即使是post方法 随便抓个包还是容易知道内容

HTTP的状态码

  • 最常见的状态码(来自百度百科)

100 Continue
客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应。
200 OK
请求已成功,请求所希望的响应头或数据体将随此响应返回。出现此状态码是表示正常状态。
201 Created
请求已经被实现,而且有一个新的资源已经依据请求的需要而建立,且其 URI 已经随Location 头信息返回。假如需要的资源无法及时建立的话,应当返回 ‘202 Accepted’。
202 Accepted
服务器已接受请求,但尚未处理。正如它可能被拒绝一样,最终该请求可能会也可能不会被执行。在异步操作的场合下,没有比发送这个状态码更方便的做法了。
302 Move Temporarily
请求的资源临时从不同的 URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。
400 Bad Request
1、语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。
2、请求参数有误。
403 Forbidden
服务器已经理解请求,但是拒绝执行它。与401响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交。如果这不是一个 HEAD 请求,而且服务器希望能够讲清楚为何请求不能被执行,那么就应该在实体内描述拒绝的原因。当然服务器也可以返回一个404响应,假如它不希望让客户端获得任何信息。
404 Not Found
请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。出现这个错误的最有可能的原因是服务器端没有这个页面。
501 Not Implemented
服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。
502 Bad Gateway
作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
504 Gateway Timeout
作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。
注意:某些代理服务器在DNS查询超时时会返回400或者500错误
在这里插入图片描述

  • 重定向状态码就好比打电话的电话转接

HTTP常见Header

Content-Type: 数据类型(text/html等)
Content-Length: Body的长度(字节)
Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
User-Agent: 声明用户的操作系统和浏览器版本信息;
referer: 当前页面是从哪个页面跳转过来的;
location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能

  • Cookie简单理解就是一个字符串 因为HTTP协议的特点就是无状态(任意多个HTTP协议请求之间 没什么关联关系) 所以要简化业务的时候就需要使用Cookie来j建立联系 就是将某个字符串保存在浏览器中 (这个字符串是ton过服务器返回响应的Set-Cookie字段来的 后序再访问服务器时 就会自动带上Cookie字段)
  • 举个简单例子说就是 当我们登录上淘宝后 后续再访问淘宝的其他页面的时候就不需要再次登录
  • 注意浏览器是按照域名来区分Cookie的 比如百度和CSDN的Cookie是相互独立的 不冲突的
    在这里插入图片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章