首页 > 解决方案 > Axios PUT 适用于 Chrome 和 Firefox,但不适用于 Safari

问题描述

我正在尝试使用 Laravel (5.4) API 将(PUT)数据发送到我的后端。在 Chrome、Firefox 和 Postman 中一切正常,但在 Safari 和 Internet Explorer(11) 中却不行。我在 Vue 组件中使用 Axios 来处理请求:

axios.put(url, params)
    .then((resp) => {
        this.getScheduleFromDB();
        this.notice = this.generic.preferencesaved;
        setTimeout(() => {
            this.notice = '';
        }, 2000);
    })
    .catch((error) => {
        this.errormessage = "error saving prefered schedule";
        this.scheduleChanged = false;
    });

在 Safari 开发工具(mac)中,我看到数据作为有效负载附加到请求中:

{
    "accesstoken": "myaccesstoken",
    "schedule": {
        "monday": [
            {
                "blocked": true
            }
        ],
        "tuesday": [],
        "wednesday": [],
        "thursday": [],
        "friday": [],
        "saturday": [],
        "sunday": [
            {
                "blocked": true
            }
        ]
    }
} 

但是,在 laravel 中, $request 是完全空的(虽然调用了控制器函数,但我在其中放置了一些日志记录)。

我添加了一个 Request 对象以使其更加直观。它有以下规则:

public function rules() {
    return [
        "accesstoken" => "required",
        "schedule" => "required"
    ];
}

所以现在 Safari 中的响应是:

{
    "accesstoken": [
        "The accesstoken field is mandatory."
    ],
    "schedule": [
        "The schedule field is mandatory."
    ]
}

在 Chrome 和 Firefox 中,响应是状态码 200,并且数据库已更新。

我尝试用 jQuery $.ajax 替换 axios。它具有完全相同的结果。Laravel 似乎不允许来自 Safari 和 Internet Explorer 的 PUT 请求有效负载,但它确实允许来自 Chrome、Firefox 和 Postman 的 PUT 请求负载。我尝试将方法更改为 POST,结果相同。有谁知道我做错了什么?

标签: javascriptlaravel-5xmlhttprequestaxios

解决方案


为将来遇到此问题的任何人找到了解决方案:我的端点 url 以 / 结尾。这使得 laravel 以 301 响应。之后数据在 safari 中消失了。请参阅https://stackoverflow.com/a/47209376/1292776 在 url 末尾删除了我的 / ,它适用于所有浏览器。


推荐阅读