XMLHTTPRequest中的OPTIONS Request而不是PUT



我尝试在REST中做web服务的html+javascript部分。以下面的代码为例:

<!DOCTYPE html> 
<html lang="en"
<script type="text/javascript">
  function testPut( url ){
  var xhr = new XMLHttpRequest();
  xhr.open( 'PUT', url, false );
  xhr.setRequestHeader( 'Content-Type', 'text/plain' );
  xhr.send( null );
  }
</script>
<body>
<form name="test" action="">
    <input type="button" value="Lanceur" onclick="testPut('http://fake.es:8080')" />
  </form>
</body>
</html>

但是在web服务器中(使用web.py完成),我得到选项而不是PUT:

111.111.111.111:52014 - - [15/May/2013 17:01:47] "HTTP/1.1 OPTIONS /" - 200 OK

我怎么解决它?删除OPTIONS请求,只发送一个PUT?

我的猜测是你的浏览器正在进行跨域请求,因此浏览器正在发送OPTIONS请求作为'预飞行请求',请求服务器允许发送PUT请求。

要确认这种情况,请查看OPTIONS请求的标头。你应该看到这些标题:

  • Origin:表示您的客户端代码所在的域
  • Access-Control-Request-Method:你想发送什么方法
  • Access-Control-Request-Headers:如果您的请求包含Accept, Content-Type和其他几个默认接受的头,则该头将被包含
OPTIONS /cors HTTP/1.1
Origin: http://your_request_domain.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: ...
Host: server_request_domain.com
...

如果服务器允许,您应该在OPTIONS响应中看到这些头:

Access-Control-Allow-Origin: <<your domain or *>>
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: <<list of allowed headers>>

查看HTML 5 Rocks CORS教程,了解跨域资源共享(CORS)的工作原理。

最新更新