【问题标题】:Axios PUT works in Chrome and Firefox but not in SafariAxios PUT 适用于 Chrome 和 Firefox,但不适用于 Safari
【发布时间】:2019-01-26 00:00:50
【问题描述】:

我正在尝试使用 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,结果相同。有谁知道我做错了什么?

【问题讨论】:

    标签: javascript laravel-5 xmlhttprequest axios


    【解决方案1】:

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

    【讨论】:

    • 该死,我以为我在这里有一个解决方案,但我没有在我的应用程序上这样做......
    【解决方案2】:

    如果 Access-Control-Allow-Methods 响应标头的值设置为 *,则可能会发生这种情况。它必须明确设置为允许方法(OPTIONS、POST、PUT、GET、DELETE、PATCH)而不是通配符,因为 iOS 中的 safari 不支持它。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 2013-06-30
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多