POST status code: 405 Method Not Allowed, 但是GET 方法可行,折腾两天,问题居然是...

您所在的位置:网站首页 gunicorn静态文件 POST status code: 405 Method Not Allowed, 但是GET 方法可行,折腾两天,问题居然是...

POST status code: 405 Method Not Allowed, 但是GET 方法可行,折腾两天,问题居然是...

2023-09-05 22:19| 来源: 网络整理| 查看: 265

这是我学习http的详细踩坑经历,只为伯君一笑: 我希望用axios来发起一个POST请求,但是老是报错 status code: 405 Method Not Allowed 。但是奇怪的是GET就可以。 我反复调试各种参数, 是不是url不对,相对路径换成绝对路径? 是不是请求头不对,尝试各种content-type? 我甚至用Jquery 的ajax, 以及原生xhr 都尝试了一遍还是没有用,一样的问题。 既然客户端不对,那是不是服务端有问题? 是不是windows PC 用来做服务端有什么限制? 于是我百度,把IIS又捣鼓了下,还是没用。 网上还有一些没节操的人说, POST 不行啊,但是就用GET问题就解决啦,我特么。。。 就这样一天半,就过去了,毫无进展。 我后来想到,既然客户端,服务端都不行,是不是我的PC有问题?毕竟公司的PC为了安全,有各种限制。于是晚上回家用自己的PC,我居然又可以了。。。 于是我把矛头直接指向了公司的PC。 公司的安全设置会做到如此地步吗,可以不让大家发起POST请求?我将信将疑。 我还是不放弃,因为我觉得我还没有找到真正的原因。 因为我的这个项目里面用到了一个游戏服务器框架,用的是websocket协议,然后attach了express 。 于是我就还是用公司的PC,重新写了一个简单的小demo,就又可以了。。。 所以这不是公司PC的锅,是我用的游戏服务器框架有这方面的限制? 我甚至准备去github以及论坛里面开骂了。。。 还是先冷静一下,还有什么我没有想到? 继续排除。 于是我在原项目里面,注释掉所有和gameServer 相关的代码, 然后仅仅在项目里面写得和成功的demo 类似的代码,结果还是不行。 这说明不是gameServer的锅,好吧,我先放gameServer的作者一马。

这时候我观察到一个现象。如果我直接在html的script标签中写ajax请求,是管用的。但是如果进行标签引用

则不灵了。 服务端代码是这样的。

app.get('/chat', (req, res) =>{ res.sendFile(path.join(__dirname, 'client', 'client.html')); });

client 目录结构 在这里插入图片描述 我在想,服务器吧client.html 发送到客户端,没有带上client.js 所以就无法发起ajax请求了,那怎样才能既带上client.js ,不需要吧js直接写在html的script 标签里, 也可行呢? 网上查了下,哦,只要加这句话

app.use("/", express.static(path.join(__dirname, "client")));

这就表示服务端把这些静态资源都加载了。 你就不会在res.sendFile的时候无法引用client.js了。 其实这句话我以前早就放上去了,除了这句,还有另外一句是一起出现的。只是当时在调试的时候都一起注释掉了。

app.use("/", serveIndex(path.join(__dirname, "client"), { icons: true })); //还有这句 app.use("/", express.static(path.join(__dirname, "client")));

这里的serveIndex 是当时游戏框架demo默认加上去的。 这可以让你把目标文件夹的东西都搞成一个静态服务器,然后可以再主页中点击访问各个文件。

于是我把serveIndex这句注释掉,只留下了 express.static 这句,居然成功的发起post请求! 所以最后的root cause终于找到了,不是ajax设置的锅,不是PC的锅,也不是gameServer作者的锅,是静态服务器的锅!!! 结论:对于静态服务器中的资源,只能GET 不能POST 当然也不能 PUT, DELETE。 结论:对于静态服务器中的资源,只能GET 不能POST 当然也不能 PUT, DELETE。 结论:对于静态服务器中的资源,只能GET 不能POST 当然也不能 PUT, DELETE。

重要的问题说三遍。 可能对于一些老手,看到这个非常可笑,这啥问题,居然用了这么多笨办法,以及花了两天时间才搞定。 但是作为一个业余选手,基本上就把我折腾够呛了。 这时候我突然想起了两句名人名言。

刘润: 你的顿悟,也许只是别人的基本功(业余对专业而言) 福尔摩斯:排除一切不可能的,剩下的即使再不可能,那也是真相。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3