OPTIONS 方法比较少见,该方法用于请求服务器告知其支持哪些其他的功能和方法。通过 OPTIONS 方法,可以询问服务器具体支持哪些方法,或者服务器会使用什么样的方法来处理一些特殊资源。可以说这是一个探测性的方法,客户端通过该方法可以在不访问服务器上实际资源的情况下就知道处理该资源的最优方式。
既然比较少见,什么情况下会使用这个方法呢?
假设在 edx.open.com 域下发起了一个跨域的 POST 请求,期望提交数据到 api.sit.com 这个域名的服务器,同时在提交数据的时候希望能监测到文件上传的实时进度。
在进行发送POST请求前,会自动先发起一个 OPTIONS 请求,其请求头包含了的一些关键性字段:
1 OPTIONS /upload/ HTTP/1.1 2 Access-Control-Request-Method: POST 3 Access-Control-Request-Headers: accept, content-type 4 Origin: http://edx.open.com 5 ...
这种场景下,客户端发起的这个 OPTIONS 可以说是一个“预请求”,用于探测后续真正需要发起的跨域 POST 请求对于服务器来说是否是安全可接受的,因为跨域提交数据对于服务器来说可能存在很大的安全问题。
请求头 Access-Control-Request-Method 用于提醒服务器在接下来的请求中将会使用什么样的方法来发起请求。
那么在服务端应该如何处理这个 OPTIONS 请求呢?
响应上面的 OPTIONS 请求时,需要添加上用于访问控制的响应头。
响应头中关键性的字段:
1 Access-Control-Allow-Method: POST 2 Access-Control-Allow-Origin: http://edx.open.com
Access-Control-Allow-Method 和 Access-Control-Allow-Origin 分别告知客户端,服务器允许客户端用于跨域的方法和域名。
完整处理流程如下:
一.在视图 def options(request, *args, **kwargs) 方法中 获取请求头的 Access-Control-Request-Method 和 Origin 参数
1 method = request.META.get('Access-Control-Allow-Method')
2 origin = request.META.get('Origin')
二.在视图 def options(request, *args, **kwargs) 方法中 设置响应头信息,返回response对象
1 response = Response() 2 response['Access-Control-Allow-Method'] = method 3 response['Access-Control-Allow-Origin'] = origin 4 return response
注意:
这里应该设置响应状态码为 204 是为了告知客户端表示该响应成功了,但是该响应并没有返回任何响应体,如果状态码为 200,还得携带多余的响应体,在这种场景下是完全多余的,只会浪费流量。
三.这里只是设置options方法对客户端的预请求进行处理,同时还要设置django后台支持跨域请求,这里就不再细说了.