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

时间:2013-05-15 15:08:43

标签: 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>

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

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

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

1 个答案:

答案 0 :(得分:13)

我的猜测是您正在进行跨域请求,因此浏览器将OPTIONS请求作为'预检请求'发送,要求服务器发送PUT请求。

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

  • 来源:这表示您的客户端代码所在的域
  • 访问控制请求方法:您尝试发送的方法
  • 访问控制请求标头:如果您的请求包含除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>>

有关跨源资源共享(CORS)如何工作的详细解释,请参阅this HTML 5 Rocks Tutorial on CORS