我尝试在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)的工作原理。