热门标签 | 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限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • IamgettingaUnicodeerror:UnicodeEncodeError:charmapcodeccantencodecharacteru\xa9in ... [详细]
  • 跨站的艺术XSS Fuzzing 的技巧
    作者|张祖优(Fooying)腾讯云云鼎实验室对于XSS的漏洞挖掘过程,其实就是一个使用Payload不断测试和调整再测试的过程,这个过程我们把它叫做F ... [详细]
  • 这篇文章主要介绍PHP如何使用在全部作用域中始终可用的内置变量,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要 ... [详细]
  • 文本处理与软件管理
    1、自建yum仓库,分别为网络源和本地源本地源:       网络源:[root@openvpn~]#catetcyum.repos.dCentOS-Base.repo#CentO ... [详细]
  • linux clickhouse安装在指定目录_Centos8服务器指定目录安装配置Nginx
    1.安装前准备(1)检查是否安装过nginx(如果没有安装过可以无视)find-namenginx搜索nginx文件及其文件夹rm-rf【nginx配置地址文件及其文件夹】手动删除 ... [详细]
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社区 版权所有