Axios PUT可在Chrome和Firefox中使用,但不能在Safari中使用

时间:2018-08-19 18:55:24

标签: javascript laravel-5 xmlhttprequest axios

我正在尝试使用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的有效负载。我尝试将方法更改为POST,结果相同。有人知道我在做什么错吗?

2 个答案:

答案 0 :(得分:0)

为以后遇到此问题的任何人找到了解决方案: 我的端点网址以/结尾。这会使laravel响应301。此后,数据会在野生动物园中消失。参见https://stackoverflow.com/a/47209376/1292776 在网址末尾删除了我/,它在所有浏览器中均适用。

答案 1 :(得分:0)

如果Access-Control-Allow-Methods响应标头的值设置为*,则会发生这种情况。必须明确将其设置为允许使用方法(OPTIONS,POST,PUT,GET,DELETE,PATCH)而不是通配符,因为iOS的野生动物园不支持通配符。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Methods