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