2

我试图在 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?

4

1 回答 1

14

我的猜测是您重新发出跨域请求,因此浏览器将 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>>

请参阅这个关于 CORS 的 HTML 5 Rocks 教程,以很好地解释跨域资源共享 (CORS) 的工作原理。

于 2013-05-15T16:34:58.447 回答