热门标签 | 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)

推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • 本文介绍了如何使用jQuery和AJAX来实现动态更新两个div的方法。通过调用PHP文件并返回JSON字符串,可以将不同的文本分别插入到两个div中,从而实现页面的动态更新。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 本文介绍了一种在PHP中对二维数组根据某个字段进行排序的方法,以年龄字段为例,按照倒序的方式进行排序,并给出了具体的代码实现。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
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社区 版权所有