您现在的位置是:焦点 >>正文

C前端模拟post请求增加header参数

焦点88人已围观

简介 C前端模拟post请求增加header参数 浏览器里点开F12,Network面板里那条红色的POST请求,十有八九是跨域被拦了。前端模拟POST请求加header参数,核心就一句话:先过预检,再谈 ...

C前端模拟post请求增加header参数

浏览器里点开F12,前t请求增Network面板里那条红色的端模POST请求,十有八九是前t请求增跨域被拦了。前端模拟POST请求加header参数,端模核心就一句话:先过预检,前t请求增再谈业务。端模预检不过,前t请求增后面全是端模白搭。

我见过太多人栽在Authorization上。前t请求增后端要token,端模前端直接fetch一写:

fetch('/api/data',前t请求增 {  method: 'POST', headers: {  'Authorization': 'Bearer ' + token }, body: JSON.stringify({ name: 'test'}) })

然后控制台报错,红彤彤一片。端模问题不在你代码,前t请求增是端模浏览器先发了个OPTIONS请求试探,后端没搭理,前t请求增直接404或500,浏览器就判定这请求不安全,给拦了。你加的自定义header,比如X-Requested-With或者X-Custom-Token,都属于非简单请求,必须服务端配合。

那怎么模拟?分两种情况。

第一种,后端你能改。那最干净。后端CORS配置里加上允许的header,比如用Node的cors中间件:

app.use(cors({  allowedHeaders: ['Authorization', 'Content-Type', 'X-Custom-Token'] }))

前端照常发,浏览器预检通过,请求正常走。这种情况没啥好说的,纯粹后端配置问题。

第二种,后端你碰不到,或者只是本地调试。这时候别硬刚浏览器。用代理工具,比如Charles、Fiddler,或者前端脚手架里的devServer代理。拿webpack举例,devServer里配个proxy:

devServer: {  proxy: {  '/api': {  target: 'http://real-server.com', changeOrigin: true, onProxyReq: (proxyReq, req, res) => {  proxyReq.setHeader('Authorization', 'Bearer ' + req.headers['x-temp-token']) } } } }

这样浏览器发的请求不带自定义header,代理层偷偷加上去,绕过跨域限制。实际开发里我常用这招,省得跟后端扯皮。

但有个坑,onProxyReq里拿到的req.headers是原始请求的,如果你前端本来就没传那个token,你从哪拿?所以前端得先把token放在一个浏览器允许的header里,比如X-Temp-Token,代理层读出来再转成Authorization。麻烦是麻烦点,但能跑通。

还有一种野路子,直接禁用浏览器安全策略。Chrome启动加参数--disable-web-security --user-data-dir=某个临时目录。这招只适合本地快速验证,别拿它糊弄测试环境。我见过有人把这参数写进启动脚本,后来忘了删,整个团队都在用禁了安全策略的浏览器测东西,后端接口裸奔了俩月。别学。

说回header本身。模拟POST请求加header,最常见的场景是加Content-Type。默认的text/plain;charset=UTF-8后端解析不了,你得显式设成application/json。但注意,一旦你设了application/json,这请求就变成非简单请求了,预检又来了。所以很多老手干脆用text/plain传JSON字符串,后端自己解析。丑是丑,但省了预检的麻烦。

我自己写调试工具时,更倾向用axios。它底层是XHR,但封装了拦截器。你可以在请求拦截器里统一加header:

axios.interceptors.request.use(config => {  config.headers['X-Debug-Token'] = localStorage.getItem('debug-token') return config })

但axios在浏览器里照样受CORS限制,拦截器只是方便你加,能不能发出去还得看预检。所以别把axios当万能药。

最后提一嘴,模拟POST请求加header,别忘了一个细节:header参数名别用下划线。有些网关或者代理服务器会吞掉带下划线的header,比如X_User_ID,折腾半天以为是跨域问题,结果是Nginx默认忽略带下划线的header。改成X-User-Id,立马通了。这坑我踩过一次,排查了三个小时,最后在Nginx配置里加了underscores_in_headers on;才解决。后来我写代码,凡自定义header一律用连字符,绝不碰下划线。

模拟POST请求加header参数,说到底就是跟浏览器的安全策略博弈。要么让后端放行,要么自己代理绕行,要么干脆走非浏览器环境。Node里用axios或者node-fetch,啥header都能加,没有CORS的破事。但前端模拟,就得认命,按规矩来。

Tags:

相关文章

  • html登录界面代码链接到另一个网页

    焦点

    登录 上面这堆代码,就是很多人写的第一行HTML。可问题在于,你把它保存成login.html,点提交,浏览器只会刷新一下页面,什么也没发生。因为form标签的action属性指到了dash ...

    【焦点】

    阅读更多
  • 孔洞设置防护措施的标准依据

    焦点

    工地上的洞口,从来不是小事。去年某高层住宅项目,一个预留的管道井在浇筑完混凝土后只盖了块模板,没固定。夜班工人路过,一脚踩上去,模板滑脱,人直接掉到下一层,腰椎骨折。事后查原因,不是没制度,是制度里写 ...

    【焦点】

    阅读更多
  • 游戏网站链接

    焦点

    上周帮表弟找《艾尔登法环》的DLC攻略,他发来一个链接,打开后满屏弹窗广告,关掉三层才看到正文。这经历太典型了。游戏网站链接的质量,直接决定你是在找攻略还是在跟广告斗智斗勇。 我收藏夹里躺着二十多个游 ...

    【焦点】

    阅读更多


友情链接