选项请求XMLHTTPRequest中的PUT而不是PUT

Zhe*_*hen 2 javascript rest web.py

我试图在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>
Run Code Online (Sandbox Code Playgroud)

但是在Web服务器(使用web.py完成)中,我获得了OPTIONS而不是PUT:

111.111.111.111:52014 - - [15/May/2013 17:01:47] "HTTP/1.1 OPTIONS /" - 200 OK
Run Code Online (Sandbox Code Playgroud)

我怎么解决它?要删除OPTIONS请求并仅发送PUT?

小智 14

我的猜测是你正在做一个跨域请求,所以浏览器发送OPTIONS请求作为'预检请求',要求服务器发送PUT请求的权限.

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

  • 来源:这表示您的客户端代码所在的域
  • 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
...
Run Code Online (Sandbox Code Playgroud)

如果服务器授予权限,您应该在OPTIONS响应中看到这些标头:

Access-Control-Allow-Origin: <<your domain or *>>
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: <<list of allowed headers>>
Run Code Online (Sandbox Code Playgroud)

有关跨源资源共享(CORS)如何工作的详细解释,请参阅CORS上的HTML 5 Rocks教程.