提问者:小点点

AngularJs$超文本传输协议发送OPTIONS而不是PUT


我知道浏览器首先向服务器发送一个OPTIONS。但是我在Angularjs 1.5中遇到了这个问题。我试图发送一个PUT请求,它正在发送一个OPTIONS。为什么这很奇怪?,因为我正在使用一个应用程序来测试我所有的url,并且url使用PUT进行罚款。

let fd = new FormData()
let d
for (d in $scope.uploadAutos) {
  fd.append(d, $scope.uploadAutos[d])
}

$http({
     method: 'PUT',
    url: `http://sitio.api.com/vehiculo/${parseInt($routeParams.id, 10)}`,
    data: fd,
    headers: { 'Content-Type': 'undefined' }
   }).then(success => {
     console.log(success)
   }, error => {
     console.log(error)
  }
)

到目前为止,这就是我处理GET和POST请求的方式,它工作得很好…但是使用PUT…嗯,有些东西不起作用。后端适合上面所说的,使用rest api应用程序测试我所有的url,PUT url工作得很好。任何帮助都很棒:)。谢谢


共2个答案

匿名用户

理想情况下,您会看到两个请求-OPTIONS请求,即飞行前请求。这是为了验证您的跨源请求标头。

验证后,您的客户端将能够发出实际的POST/PUT请求。如果您的飞行前请求失败,这意味着您的服务器上没有正确设置CORS请求标头。

需要设置以下标头:

Access-Control-Allow-Origin
Access-Control-Allow-Methods ("GET, POST, PUT, DELETE, OPTIONS")
Access-Control-Allow-Headers
Access-Control-Max-Age

匿名用户

这就是我在寻找飞行前的单词!!哈哈。好的,我已经把事情做好了。首先。我这边缺乏信息。所以我意识到问题不在角度上,不在我的后端,问题在苗条的php文档和我的知识中。当你在地图函数中使用PUT或DELETE时,你必须添加选项,这是因为

Mozilla有答案

跨源资源共享标准的工作原理是添加新的HTTP头,允许服务器描述允许使用Web浏览器读取该信息的源集。此外,对于可能对用户数据造成副作用的HTTP请求方法(特别是,对于除GET以外的HTTP方法,或对于某些MIME类型的POST使用),规范要求浏览器对请求进行“预检”,使用HTTPOPTIONS请求方法向服务器征求支持的方法,然后,在服务器“批准”后,使用实际的HTTP请求方法发送实际请求。服务器还可以通知客户端是否应随请求发送“凭据”(包括Cookie和HTTP身份验证数据)。