Nodejs 第三十一章(响应头和请求头)

响应头

HTTP响应头(HTTP response headers)是在HTTP响应中发送的元数据信息,用于描述响应的特性、内容和行为。它们以键值对的形式出现,每个键值对由一个标头字段(header field)和一个相应的值组成。

例如以下示例

Access-Control-Allow-Origin:*
Cache-Control:public, max-age=0, must-revalidate
Content-Type:text/html; charset=utf-8
Server:nginx
Date:Mon, 08 Jan 2024 18:32:47 GMT

响应头和跨域之间的关系

  • cors

跨域资源共享(Cross-Origin Resource Sharing,CORS)是一种机制,用于在浏览器中实现跨域请求访问资源的权限控制。当一个网页通过 XMLHttpRequest 或 Fetch API 发起跨域请求时,浏览器会根据同源策略(Same-Origin Policy)进行限制。同源策略要求请求的源(协议、域名和端口)必须与资源的源相同,否则请求会被浏览器拒绝

  • 发送请求
fetch('http://localhost:3000/info').then(res=>{return res.json()
}).then(res=>{console.log(res)
})
  • express 编写一个get接口
import express from 'express'
const app = express()
app.get('/info', (req, res) => {res.json({code: 200})
})
app.listen(3000, () => {console.log('http://localhost:3000')
})

发现是有报错的 根据同源策略我们看到协议一样,域名一样,但是端口不一致,端口也无法一致,会有冲突,否则就是前后端不分离的项目,前后端代码放在一起,只用一个端口,不过我们是分离的没法这么做。

image.png

这时候我们就需要后端支持一下,跨域请求资源放行

Access-Control-Allow-Origin: * | Origin

增加以下响应头 允许localhost 5500 访问

app.use('*',(req,res,next)=>{res.setHeader('Access-Control-Allow-Origin','http://localhost:5500') //允许localhost 5500 访问next()
})

结果返回

image.png

请求头

默认情况下cors仅支持客户端向服务器发送如下九个请求头

tips 没有application/json

  1. Accept:指定客户端能够处理的内容类型。
  2. Accept-Language:指定客户端偏好的自然语言。
  3. Content-Language:指定请求或响应实体的自然语言。
  4. Content-Type:指定请求或响应实体的媒体类型。
  5. DNT (Do Not Track):指示客户端不希望被跟踪。
  6. Origin:指示请求的源(协议、域名和端口)。
  7. User-Agent:包含发起请求的用户代理的信息。
  8. Referer:指示当前请求的源 URL。
  9. Content-type: application/x-www-form-urlencoded | multipart/form-data | text/plain

如果客户端需要支持额外的请求那么我们需要在客户端支持

'Access-Control-Allow-Headers','Content-Type' //支持application/json

请求方法支持

我们服务端默认只支持 GET POST HEAD OPTIONS 请求

例如我们遵循restFui 要支持PATCH 或者其他请求

增加patch

app.patch('/info', (req, res) => {res.json({code: 200})
})

发送patch

 fetch('http://localhost:3000/info',{method:'PATCH',
}).then(res=>{return res.json()
}).then(res=>{console.log(res)
})

发现报错说patch不在我们的methods里面

image.png

修改如下

'Access-Control-Allow-Methods','POST,GET,OPTIONS,DELETE,PATCH'

image.png

预检请求 OPTIONS

预检请求的主要目的是确保跨域请求的安全性 它需要满足一定条件才会触发

  1. 自定义请求方法:当使用非简单请求方法(Simple Request Methods)时,例如 PUT、DELETE、CONNECT、OPTIONS、TRACE、PATCH 等,浏览器会发送预检请求。
  2. 自定义请求头部字段:当请求包含自定义的头部字段时,浏览器会发送预检请求。自定义头部字段是指不属于简单请求头部字段列表的字段,例如 Content-Type 为 application/json、Authorization 等。
  3. 带凭证的请求:当请求需要在跨域环境下发送和接收凭证(例如包含 cookies、HTTP 认证等凭证信息)时,浏览器会发送预检请求。
  • 尝试发送预检请求
 fetch('http://localhost:3000/info',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({name:'xmzs'})
}).then(res=>{return res.json()
}).then(res=>{console.log(res)
})
  • express
app.post('/info', (req, res) => {res.json({code: 200})
})

发现报错了

image.png

因为 application/json 不属于cors 范畴需要手动支持

'Access-Control-Allow-Headers','Content-Type'

image.png

image.png

自定义响应头

在我们做需求的时候肯定会碰到后端自定义响应头

app.get('/info', (req, res) => {res.set('xmzs', '1')res.json({code: 200})
})

image.png

前端如何读取呢?

 fetch('http://localhost:3000/info').then(res=>{const headers = res.headers console.log(headers.get('xmzs')) //读取自定义响应头return res.json()
}).then(res=>{console.log(res)
})

发现是null 这是因为后端没有抛出该响应头所以后端需要增加抛出的一个字段

app.get('/info', (req, res) => {res.set('xmzs', '1')res.setHeader('Access-Control-Expose-Headers', 'xmzs')res.json({code: 200})
})

image.png

SSE技术

Server-Sent Events(SSE)是一种在客户端和服务器之间实现单向事件流的机制,允许服务器主动向客户端发送事件数据。在 SSE 中,可以使用自定义事件(Custom Events)来发送具有特定类型的事件数据。

webSocket属于全双工通讯,也就是前端可以给后端实时发送,后端也可以给前端实时发送,SSE属于单工通讯,后端可以给前端实时发送

  • express
    增加该响应头text/event-stream就变成了sse
    event 事件名称 data 发送的数据
app.get('/sse',(req,res)=>{res.setHeader('Content-Type', 'text/event-stream')res.status(200)setInterval(() => {res.write('event: test\n')res.write('data: ' + new Date().getTime() + '\n\n')}, 1000)
})

前端接受

const sse = new EventSource('http://localhost:3000/sse')
sse.addEventListener('test', (event) => {console.log(event.data)
})

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/612080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三十九级台阶

解题思路: 本题运用递归的思想,每走一步可以上一个或者两个台阶,一开始是左脚最后是右脚,所以走的总步数应该为偶数,最后跨过的台阶数应该等于39。 解题代码: public class disnashijiujitaijie {static i…

03. BI - 详解机器学习神器 XGBoost

本文专辑 : 茶桁的AI秘籍 - BI篇 原文链接: https://mp.weixin.qq.com/s/kLEg_VcxAACy8dH35kK3zg 文章目录 集成学习XGBoost Hi,你好。我是茶桁。 学习总是一个循序渐进的过程,之前两节课的内容中,咱们去了解了LR和SVM在实际项目中是如何使…

ROS2学习笔记二:开发准备

目录 1 DDS介绍 2. 工程介绍 4 构建工具colcon 5 启动一个节点 1 DDS介绍 DDS,全称 Data Distribution Service (数据分发服务)。是由对象管理组 (OMG) 于 2003 年发布并于 2007 年修订的开分布式系统标准。通过类似于ROS中的话题发布和订阅形式来进行通信&…

100V耐压 LED恒流驱动芯片 SL2516D兼容替换LN2516车灯照明芯片

SL2516D LED恒流驱动芯片是一款专为LED照明设计的高效、高精度恒流驱动芯片。与LN2516车灯照明芯片兼容,可直接替换LN2516芯片,为LED车灯照明提供稳定、可靠的电源解决方案。 一、SL2516D LED恒流驱动芯片的特点 1. 高效率:SL2516D采用先进的…

HarmonyOS4.0系统性深入开发17进程模型概述

进程模型概述 HarmonyOS的进程模型: 应用中(同一包名)的所有UIAbility运行在同一个独立进程中。WebView拥有独立的渲染进程。 基于HarmonyOS的进程模型,系统提供了公共事件机制用于一对多的通信场景,公共事件发布者…

深度解析-Java语言的未来

深度解析-Java语言的未来,文末有我耗时一个月,问遍了身边的大佬,零基础自学Java的路线,适用程序员入门&进阶,Java学习路线,2024新版最新版。 文章目录 Q1 - 能否自我介绍下? Q2 - Java语…

Python常用配置文件读取方法

常见的应用配置方式有环境变量和配置文件,对于微服务应用,还会从配置中心加载配置,比如nacos、etcd等,有的应用还会把部分配置写在数据库中。此处主要记录从环境变量、.env文件、.ini文件、.yaml文件、.toml文件、.json文件读取配置。 ini文件 ini文件格式一般如下: [m…

GBASE南大通用CreateParameter 方法

创建一个GBASE南大通用Parameter 对象的实例。  语法 [Visual Basic] Public Function CreateParameter As GBaseParameter [C#] public GBaseParameter CreateParameter()  返回值 创建的 GBaseParameter 对象。 执行一个 SQL 语句并返回影响的行数。  语法 […

设计模式——抽象工厂模式(Abstract Factory Pattern)

概述 抽象工厂模式的基本思想是将一些相关的产品组成一个“产品族”,由同一个工厂统一生产。在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法具有唯一性,一般情况下,一个具体工厂…

数据结构与算法之美学习笔记:46 | 概率统计:如何利用朴素贝叶斯算法过滤垃圾短信?

目录 前言算法解析总结引申 前言 本节课程思维导图: 上一节我们讲到,如何用位图、布隆过滤器,来过滤重复的数据。今天,我们再讲一个跟过滤相关的问题,如何过滤垃圾短信? 垃圾短信和骚扰电话,我…

基于长短期神经网络LSTM的路径追踪

目录 背影 摘要 代码和数据下载:基于长短期神经网络LSTM的路径追踪(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88714816 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络LSTM的路径追踪 结果分析 展望 参考论文 背影 路径坐标…

【MySQL】巧用 DATE_SUB 函数判断时间是否连续

力扣题 1、题目地址 1454. 活跃用户 2、模拟表 表 Accounts: Column NameTypeidintnamevarchar id 是该表主键(具有唯一值的列)该表包含账户 id 和账户的用户名. 表 Logins: Column NameTypeidintlogin_datedate 该表可能…

docker安装nodejs,并更改为淘宝源

拉取官方 Node.js 镜像 docker pull node:latest创建 Dockerfile,并更改 NPM 下载源为淘宝源,设置为全局持久化 # 使用最新版本的Node.js作为基础镜像 FROM node:latest# 设置工作目录为/app WORKDIR /app # 更改 NPM 下载源为淘宝源,并设置…

c++学习笔记-STL案例-机房预约系统1-需求分析

1 机房预约系统需求 1.1 简单介绍 学校有几个规格不同的机房,由于使用经常出现“撞车”现象,现在开发一套预约系统,解决这一问题。 1.2 身份介绍 分别有三种身份使用该系统 学生代表:申请使用机房教师:审核学生的…

从单细胞数据分析的最佳实践看R与Python两个阵营的博弈

R与Python,在生物信息学领域的博弈异常激烈。许多生信分析,两个阵营都发展出了自己的方法,比如单细胞数据分析,R有Seurat,Python就有Scanpy。这些层出不穷的方法不断地吸引着吃瓜群众的眼球,同时也让人患上…

Qt 6之六:Qt Designer介绍

Qt 6之六:Qt Designer介绍 Qt Designer是一个可视化的用户界面设计工具,用于创建Qt应用程序的用户界面,允许开发人员通过拖放和布局来设计和创建GUI界面。 Qt 6之一:简介、安装与简单使用 https://blog.csdn.net/cnds123/articl…

Windows系统Copilot使用方案

在Windows环境中启用和使用Copilot的一般步骤和方案概述: 启用Windows Copilot 确保系统更新: 首先,您的设备需要运行最新的Windows 11版本,因为Copilot可能作为系统更新的一部分推出。 安装与激活: 如果Copilot是通过…

Linux 文件(夹)权限查看

命令 : ls -al ls -al 是一个用于列出指定目录下所有文件和子目录的命令,包括隐藏文件和详细信息。其中,-a 选项表示显示所有文件,包括以 . 开头的隐藏文件,-l 选项表示以列表的形式显示文件的详细信息。 本例中:drwxrwxr-x 为权限细节。 权限细节(Permission detail…

【UML】第18篇 组件图

目录 一、组件图的定义 二、组件图的作用 三、应用场景 四、构成 五、语法 一、组件图的定义 组件图(Component Diagram)是一种UML结构图,它展示了系统中组件、接口以及它们之间的关系。组件是代码的物理模块,如文件、库、可…

Vue3-47-Pinia-修改全局状态变量值的方式

说明 修改全局状态变量的值,是一个比较常规而且常见的操作。 本文就介绍四种常见的操作。 由于Option Store 和Setup Store 在修改的时候略有不同,所以本文也会将不同点体现一下。 全局状态变量的定义 包含了 Option Store 和Setup Store 两种定义方式&a…