Axios/XMLHttpRequest在生产环境中发送GET而不是POST请求

13

我遇到了一个非常奇怪的问题。我们正在将一个应用程序投入生产,其中一个POST请求变成了一个直接跟随同一URL的GET请求,并且后端(Laravel)从未收到这个POST请求。在Chrome网络选项卡中,它看起来只是一个GET请求,但是通过Burpsuite,我们可以看到POST请求。

负责此问题的代码

async store() {
    // This prints post
    console.log(this.method());

    await this.form[this.method()]('/api/admin/users/' + (this.isUpdate() ? this.id : ''));

    if (!this.isUpdate()) {
        this.form.reset();
    }
},
标签的post方法内容
return new Promise((resolve, reject) => {
    axios[requestType](url, this.data())
    .then(response => {
        this.busy = false;
        this.onSuccess(response.data);
        resolve(response.data);
    })
    .catch(error => {
        this.busy = false;
        if (error.response.status == 400) {
            return this.displayErrors(error.response.data)
        }
        this.onFail(error.response.data.errors);
        reject(error.response.data);
    });
});

2
你很可能遇到了301/302重定向。例如,如果你的生产服务器尝试将所有的http流量重定向到https,那么任何http的POST请求都将被重定向到https,但将被转换为GET请求。你可以查看这个答案以获得稍微详细一些的解释。 - patricus
可能是重复问题:axios.post正在发送GET请求 - Malcolm
3个回答

44

这个问题我也在Larachat的Slack论坛上回答过,现在为了其他人的方便,我在这里回答下一个遇到类似问题的人。

稍微讲一下背景。在聊天中我们发现出现了301错误,这是一个重定向错误。最近我在向暂存服务器的URL发布文章时也遇到了同样的错误,在本地运行正常但在暂存服务器上不行。

问题似乎在于发布URL末尾有一个斜杠“/”。

因此,发布到https://example.com/post/to/将无法工作。

移除斜杠/并发布到https://example.com/post/to将会起作用。


5
我不知道为什么,但在我的情况下我必须做相反的事情!! - markroxor
好的指针,谢谢!结果发现我正在发布到非i18n端点,这导致后端重定向到本地化的URL。这导致POST请求最终变成了GET请求。 - Samuel Blattner
你为我省了一次面试!我欠你一个人情。 - nwillo
1
在我的情况下,我不得不使用 https://www.example.com 而不是 https://example.com - user3437245
1
非常感谢...在我的情况下,我的端点是http而不是https,因此它被重定向并获得了301状态。这些都是令人尴尬的时刻,但修复错误感觉真好。 - Fernando Martinez Avila
显示剩余2条评论

0
只是提供一下信息,我遇到了同样的问题 - axios 请求被重定向。对我来说,结果证明是某个本地化中间件导致了重定向!
我在 API 路由文件中设置了一个备用路由(同样是 Laravel,就像问题中描述的那样),绕过了那个中间件(可能应该是最初应该去的地方!)。现在一切都好了!我犯了个初级错误!

你能展示一下你是如何在axios中修复它的吗?谢谢。 - Sakhi Mansoor
@SakhiMansoor - 我的问题在 Axios 中没有得到解决 - 对我来说,是一些中间件将 POST 重定向为 GET。 - Nick A

0

我确认之前的答案。我也遇到了从本地到生产环境的同样问题。

调用像/ api / user / store /这样的端点可能会被重定向到/ api / user / store,并返回301状态码,这个调用被解释为GET请求,显然我们无法访问(因为它不在我们的路由列表中)。所以它不起作用。

一种解决方案是在Apache配置上进行修改(删除最后一个斜杠),但我更喜欢调整我的Axios调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接