热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HTTP协议和cookit的使用

HTTP协议和cookit的使用HTTPHTTP的工作流程和服务器建立链接发送一个请求接受一个响应断开于服务端的链接完成一个HTTP请求常见的HTTP响应状态码100~199200

HTTP协议和cookit的使用

  • HTTP
    • HTTP 的工作流程
      • 和服务器建立链接
      • 发送一个请求
      • 接受一个响应
      • 断开于服务端的链接
      • 完成一个 HTTP 请求
    • 常见的 HTTP 响应状态码
      • 100 ~ 199
      • 200 ~ 299
      • 300 ~ 399
      • 400 ~ 499
      • 500 ~ 599
    • 常见的 HTTP 请求方式
      • GET 请求
      • POST 请求
  • COOKIE
    • COOKIE 的存储形式
    • COOKIE 的特点
    • 使用方式
    • COOKIE 操作封装
      • 设置 COOKIE
      • 读取 COOKIE
      • 删除 COOKIE
      • 基本封装
      • 高级封装
  • 问题补充:


HTTP
  • http 是我们前后台交互的时候的传输协议(即超文本传输协议)

HTTP 的工作流程


  1. 和服务器建立链接
  2. 建立链接后,发送一个请求给服务器(请求)
  3. 服务器接受到请求以后进行相应的处理并给出一个回应(响应)
  4. 断开于服务器的链接

和服务器建立链接


  • 怎么和服务器建立链接呢?

  • 需要保证客户端的接受和发送正常,服务器端的接受和发送正常

  • 这里就涉及到一个东西叫做 TCP/IP 协议

  • 建立链接的主要步骤叫做 三次握手

    1. 客户端发送一个消息给到服务端

      此时:服务端知道了 客户端可以正常发送消息服务端知道了 服务端可以正常接受消息

    2. 服务端回给客户端一个消息

      此时:服务端知道了 客户端可以正常发送消息服务端知道了 服务端可以正常接受消息客户端知道了 客户端可以正常发送消息客户端知道了 客户端可以正常接受消息客户端知道了 服务端可以正常接受消息客户端知道了 服务端可以正常发送消息

    3. 客户端再回给服务端一个消息

      此时:服务端知道了 客户端可以正常发送消息服务端知道了 服务端可以正常接受消息客户端知道了 客户端可以正常发送消息客户端知道了 客户端可以正常接受消息客户端知道了 服务端可以正常接受消息客户端知道了 服务端可以正常发送消息服务端知道了 服务端可以正常发送消息服务端知道了 客户端可以正常接受消息

  • 至此,依照 TCP/IP 协议的建立链接就建立好了

  • 双方都知道双方可以正常收发消息

  • 就可以进入到第二步,通讯了


发送一个请求


  • 建立完链接以后就是发送请求的过程

  • 我们的每一个请求都要把我们的所有信息都包含请求

  • 每一个请求都会有一个 请求报文

  • 请求报文 中会包含我们所有的请求信息(也就是我们要和服务端说的话都在里面)

  • 我们的请求报文中会包含几个东西

    1. 请求行

      POST /user HTTP/1.1
      # POST 请求方式
      # /user 请求URL(不包含域名)
      # HTTP/1.1 请求协议版本

    2. 请求头(请求头都是键值对的形式出现的)

      user-agent: Mozilla/5.0 # 产生请求的浏览器信息
      accept: application/json # 表示客户端希望接受的数据类型
      Content-Type: application/x-www-form-urlencoded # 客户端发送的实体数据格式
      Host: 127.0.0.1 # 请求的主机名(IP)

    3. 请求空行(请求头和请求主体之间要留一个空白行)

      # 就是一个空行

    4. 请求体(本次请求携带的数据)

      # GET 请求是没有请求体数据的
      # POST 请求才有请求体数据

  • 接下来看一个完整的请求报文

    POST /user HTTP/1.1 # 请求行
    Host: www.user.com
    Content-Type: application/x-www-form-urlencoded
    accept: application/json
    User-agent: Mozilla/5.0. # 以上是首部
    #(此处必须有一空行) # 空行分割header和请求内容
    name=world # 请求体


接受一个响应


  • 客户端的请求发送到服务端以后

  • 服务端进行对应的处理

  • 会给我们返回一个响应

  • 每一个响应都会有一个 响应报文

  • 响应报文 中会包含我们所有的响应信息(也就是服务端在接受到客户端请求以后,给我们的回信)

  • 我们的 响应报文 中会包含几个信息

    1. 状态行

      HTTP/1.1 200 OK
      # HTTP/1.1 服务器使用的 HTTP 协议版本
      # 200 响应状态码
      # OK 对响应状态码的简单解释

    2. 响应头

      Date: Jan, 14 Aug 2019 12:42:30 GMT # 服务器时间
      Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45 # 服务器类型
      Content-Type: text/html # 服务端给客户端的数据类型
      Content-Length: 11 # 服务端给客户端的数据长度

    3. 响应体

      hello world
      # 服务端给客户端的响应数据


断开于服务端的链接


  • 之前我们的建立链接是基于 TCP/IP 协议的 三次握手

  • 我们的断开链接是基于

    TCP/IP

    协议的

    四次挥手

    1. 客户端发送一个我要断开的消息给服务端
    2. 服务端接受到以后发送一个消息告诉客户端我已经进入关闭等待状态
    3. 服务端再次发送一个消息告诉客户端,这个是我的最后一次消息给你,当我再接受到消息的时候就会关闭
    4. 客户端接受到服务端的消息以后,告诉服务器,我已经关闭,这个是给你的最后一个消息

完成一个 HTTP 请求


  • 至此,一个 HTTP 请求就完整的完成了
  • 一个 HTTP 请求必须要包含的四个步骤就是
    1. 建立链接
    2. 发送请求
    3. 接受响应
    4. 断开链接
  • 在一个 HTTP 请求中,请求的部分有请求报文,接受响应的部分有响应报文
  • 请求报文包含
    1. 请求行
    2. 请求头
    3. 请求空行
    4. 请求体
  • 响应报文
    1. 状态行
    2. 响应头
    3. 响应体
      在这里插入图片描述

常见的 HTTP 响应状态码


  • 在一个 HTTP 请求的响应报文中的状态行会有一个响应状态码
  • 这个状态码是用来描述本次响应的状态的
  • 通常会出现五种状态码
    1. 100 ~ 199
    2. 200 ~ 299
    3. 300 ~ 399
    4. 400 ~ 499
    5. 500 ~ 599

100 ~ 199


  • 一般我们看不到,因为表示请求继续
  • 100: 继续请求,前面的一部分内容服务端已经接受到了,正在等待后续内容
  • 101: 请求者已经准备切换协议,服务器页表示同意

200 ~ 299


  • 2 开头的都是表示成功,本次请求成功了,只不过不一样的状态码有不一样的含义(语义化)
  • 200: 标准请求成功(一般表示服务端提供的是网页)
  • 201: 创建成功(一般是注册的时候,表示新用户信息已经添加到数据库)
  • 203: 表示服务器已经成功处理了请求,但是返回的信息可能来自另一源
  • 204: 服务端已经成功处理了请求,但是没有任何数据返回

300 ~ 399


  • 3 开头也是成功的一种,但是一般表示重定向
  • 301: 永久重定向
  • 302: 临时重定向
  • 304: 使用的是缓存的数据
  • 305: 使用代理

400 ~ 499


  • 4 开头表示客户端出现错误了
  • 400: 请求的语法服务端不认识
  • 401: 未授权(你要登录的网站需要授权登录)
  • 403: 服务器拒绝了你的请求
  • 404: 服务器找不到你请求的 URL
  • 407: 你的代理没有授权
  • 408: 请求超时
  • 410: 你请求的数据已经被服务端永久删除

500 ~ 599


  • 5 开头的表示服务端出现了错误
  • 500: 服务器内部错误
  • 503: 服务器当前不可用(过载或者维护)
  • 505: 请求的协议服务器不支持

常见的 HTTP 请求方式


  • 每一个 HTTP 请求在请求行里面会有一个东西叫做请求方式
  • 不同的请求方式代表的含义不同
    1. GET: 一般用于获取一些信息使用(获取列表)
    2. POST: 一般用于发送一些数据给服务端(登录)
    3. PUT: 一般用于发送一些数据给服务当让其添加新数据(注册)
    4. DELETE: 一般用域删除某些数据
    5. HEAD: 类似于 GET 的请求,只不过一般没有响应的具体内容,用于获取报文头
    6. CONNECT: HTTP/1.1 中预留的方式,一般用于管道链接改变为代理的时候使用
    7. PATCH: 是和 PUT 方式类似的一个方式,一般用于更新局部数据
    8. OPTIONS: 允许客户端查看服务端性能
  • 我们比较常用的就是 GET 和 POST

GET 请求


  • 参数以 querystring 的形式发送,也就是直接拼接在 请求路径的后面
  • GET 请求会被浏览器主动缓存
  • GET 请求根据不同的浏览器对长度是有限制的
    • IE: 2083 个字符
    • FireFox: 65536 个字符
    • Safari: 80000 个字符
    • Opera: 190000 个字符
    • Chrome: 8182 个字符
    • APACHE(server): 理论上接受的最大长度是 8192 个字符(有待商榷)
  • 对参数的类型有限制,只接受 ASCII 码的格式
  • GET 请求是明文发送,相对不安全

POST 请求


  • 参数以 request body的形式发送,也就是放在请求体中
  • POST 请求不会被浏览器主动缓存,除非手动设置
  • POST 请求理论上是没有限制的,除非服务端做了限制
  • 对参数类型没有限制,理论上可以传递任意数据类型,只不过要和请求头对应
  • POST 请求是密文发送,相对安全

COOKIE
  • COOKIE 是一个以字符串的形式存储数据的位置
  • 每一个 HTTP 请求都会在请求头中携带 COOKIE 到服务端
  • 每一个 HTTP 响应都会在响应头中携带 COOKIE 到客户端
  • 也就是说,COOKIE 是不需要我们手动设置,就会自动在 客户端 和 服务端之间游走的数据
  • 我们只是需要设置一下 COOKIE 的内容就可以

COOKIE 的存储形式


  • COOKIE 是以字符串的形式存储,在字符串中以 key=value 的形式出现

  • 每一个 key=value 是一条数据

  • 多个数据之间以 ; 分割

    // COOKIE 的形态
    'a=100; b=200; c=300;'


COOKIE 的特点


  1. 存储大小有限制,一般是 4 KB 左右
  2. 数量有限制,一般是 50 条左右
  3. 有时效性,也就是有过期时间,一般是 会话级别(也就是浏览器关闭就过期了)
  4. 有域名限制,也就是说谁设置的谁才能读取

使用方式


  • 读取 COOKIE 的内容使用 document.COOKIE

    const COOKIE = document.COOKIE
    console.log(COOKIE) // 就能得到当前 COOKIE 的值

  • 设置 COOKIE 的内容使用 document.COOKIE

    // 设置一个时效性为会话级别的 COOKIE
    document.COOKIE = 'a=100'// 设置一个有过期时间的 COOKIE
    document.COOKIE = 'b=200;expires=Thu, 18 Dec 2043 12:00:00 GMT";'
    // 上面这个 COOKIE 数据会在 2043 年 12 月 18 日 12 点以后过期,过期后会自动消失

  • 删除 COOKIE 的内容使用 document.COOKIE

    // 因为 COOKIE 不能直接删除
    // 所以我们只能把某一条 COOKIE 的过期时间设置成当前时间之前
    // 那么浏览器就会自动删除 COOKIE
    document.COOKIE = 'b=200;expires=Thu, 18 Dec 2018 12:00:00 GMT";'


COOKIE 操作封装


  • 因为 js 中没有专门操作 COOKIE 增删改查的方法
  • 所以需要我们自己封装一个方法

设置 COOKIE

/*** setCOOKIE 用于设置 COOKIE* @param {STRING} key 要设置的 COOKIE 名称* @param {STRING} value 要设置的 COOKIE 内容* @param {NUMBER} expires 过期时间*/
function setCOOKIE (key, value, expires) {const time = new Date()time.setTime(time.getTime() - 1000 * 60 * 60 * 24 * 8 + expires) // 用于设置过期时间document.COOKIE = `${key}=${value};expires=${time};`
}

读取 COOKIE

/*** getCOOKIE 获取 COOKIE 中的某一个属性* @param {STRING} key 你要查询的 COOKIE 属性* @return {STRING} 你要查询的那个 COOKIE 属性的值*/
function getCOOKIE(key) {const COOKIEArr = document.COOKIE.split(';')let value = ''COOKIEArr.forEach(item => {if (item.split('=')[0] === key) {value = item.split('=')[1]}})return value
}

删除 COOKIE

/*** delCOOKIE 删除 COOKIE 中的某一个属性* @param {STRING} name 你要删除的某一个 COOKIE 属性的名称*/
function delCOOKIE(name) {setCOOKIE(name, 1, -1)
}

基本封装

// 设置COOKIE(增改一体);function setCOOKIE(name, value, expires) {// 核心 : 操作字符串 !;var COOKIE_str &#61; name &#43; "&#61;" &#43; value;//判定是否有必要增加过期时间;if (typeof expires &#61;&#61;&#61; "number") {var d &#61; new Date();d.setDate(d.getDate() &#43; expires);COOKIE_str &#43;&#61; ";expires&#61;" &#43; d;}// 把拼接好的字符串设置到 document.COOKIE 上;// console.log(COOKIE_str);document.COOKIE &#61; COOKIE_str;}// 结果验证//setCOOKIE("password","123456",1);// 获取COOKIE;function getCOOKIE(name) {// 分割;// 一定要以 分号加空格 的间隔进行分割;var COOKIE_arr &#61; document.COOKIE.split("; ");for (var i &#61; 0; i < COOKIE_arr.length; i&#43;&#43;) {// 每一条COOKIE &#61;> key&#61;value;var COOKIE_item &#61; COOKIE_arr[i]// console.log(COOKIE_item);COOKIE_item &#61; COOKIE_item.split("&#61;");if (COOKIE_item[0] &#61;&#61; name) {return COOKIE_item[1];}}return "";}// 结果验证// var res &#61; getCOOKIE("password")// console.log(res)// 删除 COOKIE ;function removeCOOKIE(name) {setCOOKIE(name, "", -1);}// 结果验证// removeCOOKIE("password")

设置COOKIE(增改一体)
在这里插入图片描述
获取COOKIE
在这里插入图片描述
删除 COOKIE
在这里插入图片描述

高级封装

function setCOOKIE(name, value, options) {// options默认值 如果没有值&#xff0c;则为空对象options &#61; options || {}// 判断时间 如果不是数字类型 则为session COOKIE (会话COOKIE)if (typeof options.expires &#61;&#61;&#61; "number") {var time &#61; new Date()time.setDate(time.getDate() &#43; options.expires)}// 返回值 这里面是用数组形式 return document.COOKIE &#61; [// 拼接字符串 比如 fqniu&#61;hello worldname &#43; "&#61;" &#43; value,// 判断是否为字符串 是 执行前面的 不是则为空字符串typeof options.domain &#61;&#61;&#61; "string" ? ";domain&#61;" &#43; options.domain : "",// 判断是否为字符串 是 执行前面的 不是则为空字符串typeof options.path &#61;&#61;&#61; "string" ? ";path&#61;" &#43; options.path : "",// 判断是否为数值 是 执行前面的 不是则为空字符串typeof options.expires &#61;&#61;&#61; "number" ? ";expires&#61;" &#43; time : ""].join("");}var res &#61; setCOOKIE("fqniu", "hello world", {domain: "localhost",path: "0709",expires: 1})console.log(res)

在这里插入图片描述

问题补充&#xff1a;
  1. 为啥打开php之后不执行

    1. file协议打开的(本地打开没有使用服务器)
    2. 你用编辑器的服务器打开了 端口号不是我们开启的nginx服务器端口;
  2. http学习路线 :

    1. http 是什么 : 一个超文本传输协议。 可靠的&#xff0c;无状态的。
    2. http 干什么 : 请求 ( 浏览器 &#61;> 服务器 ) req &#xff0c; 响应(服务器 &#61;> 浏览器) res。
    3. http 协议规定 :
      1. 请求 :
        1. 请求行 : http版本 , url 路径&#xff0c; 请求方式
        2. 请求头 : 乱七八糟的信息 key&#61;value 形式传入的
        3. 请求空行 :
        4. 请求体 : GET 没有 | POST 有;
      2. 响应 :
        1. 响应行 : http版本 , 状态码 ( 1 ,2 成功 ,3 重定向 , 4 请求错误 , 5 服务端错误 ), 状态码解释
        2. 响应头 : 乱七八糟的信息 key&#61;value 形式传入的
        3. 响应体 : 服务器返回的数据
    4. 协议的请求方式 :
      1. GET *
      2. POST *
      3. PUT
      4. DELETE
      5. PETACH
      6. OPTIONS
      7. CONNECT
      8. HEAD
  3. COOKIE : 每个服务器的身份牌&#xff0c;存储在客户端由浏览器进行设置和读取

    1. 如何操作COOKIE :
      1. 后端 (php)
        1. 设置COOKIE : setCOOKIE( key , value , expires , path , domain )
        2. $_COOKIE[COOKIE的key值]
      2. 前端操作 :
        1. 设置COOKIE : document.COOKIE &#61; COOKIE_string
        2. 获取COOKIE : document.COOKIE;
    2. 你必须知道的COOKIE知识 :
      1. COOKIE的使用常识 :
        1. COOKIE是纯文本
        2. COOKIE最大3kb
        3. COOKIE最多50条
        4. COOKIE过期时间限制 : 过期时间&#xff0c; 会话COOKIE
        5. 被浏览器的同源策略保护
    3. COOKIE自动携带在http协议之中;
    4. COOKIE 封装 :
      1. setCOOKIE
      2. removeCOOKIE
      3. getCOOKIE
  4. 数据库里面取出中文会乱码 中文 &#61;> ??

    1. 设置数据库的解析引擎为 innoDB
    2. 设置表的解析引擎 innoDB
    3. php操作数据库之前 mysql_query("set namse utf8")
  5. 斤拷锟*类的乱码

    1. 设置http的请求头 :
      1. html :
      2. php : header(content-type:text/html;charset&#61;utf8)

推荐阅读
  • 包含phppdoerrorcode的词条 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • CentOS 7 中 iptables 过滤表实例与 NAT 表应用详解
    在 CentOS 7 系统中,iptables 的过滤表和 NAT 表具有重要的应用价值。本文通过具体实例详细介绍了如何配置 iptables 的过滤表,包括编写脚本文件 `/usr/local/sbin/iptables.sh`,并使用 `iptables -F` 清空现有规则。此外,还深入探讨了 NAT 表的配置方法,帮助读者更好地理解和应用这些网络防火墙技术。 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • 小程序的授权和登陆
    小程序的授权和登陆 ... [详细]
  • 本文详细介绍了如何在PHP中记录和管理行为日志,包括ThinkPHP框架中的日志记录方法、日志的用途、实现原理以及相关配置。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • Spark中使用map或flatMap将DataSet[A]转换为DataSet[B]时Schema变为Binary的问题及解决方案
    本文探讨了在使用Spark的map或flatMap算子将一个数据集转换为另一个数据集时,遇到的Schema变为Binary的问题,并提供了详细的解决方案。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
author-avatar
曹月洪_867
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有