1. 浏览器端:
在发送跨域请求时,如:PUT http://cat:1974/api/v1/sources/16162
浏览器会自动将同样的参数以OPTIONS的请求方式对服务器进行请求:OPTIONS http://cat:1974/api/v1/sources/16162
当得到服务器端进行允许跨域的响应之后,才会按照我们指定的方式进行请求,如下图:
2. 服务器端(cherrypy):
假设服务器端有如下的可被访问的资源:
cherrypy会对跨域请求的url进行一系列的前处理,获取到所请求的方法名以及参数,找到相匹配的方法进行分配
如上中举的例子,当cherrypy获取到请求OPTIONS http://cat:1974/api/v1/sources/16162时,
它会根据url所指定的请求资源(sources),方法(OPTIONS),以及相应参数(start),找到相对应的方法,
但是由于相应的OPTIONS方法参数列表为空,与请求的参数start不匹配,所以cherrypy认为没有合适的资源,直接响应404,如下图:
2.1 所以使用cherrypy实现rest api跨域时,需要考虑到参数列表的情况,
上面的情况可以将OPTIONS和GET的参数列表设为一样即可:
2.2 但是这样只能解决带有一个参数的请求跨域的情况,
如果浏览器发送的是GET http://cat:1974/api/v1/sources/0/10 这样的多参数的请求,则会有同样的问题,
这里可以用到python的可变参数*arg:
这样的话,不管OPTION有多少个参数,都能请求成功了
2.3 另外,上面举的例子都是rest风格的url,如果换为标准的HTTP GET风格的url就需要使用**kwargs了,
如GET http://cat:1974/api/v1/sources?start=0&count=10
3. 最后的解决方案:
在发送跨域请求时,如:PUT http://cat:1974/api/v1/sources/16162
浏览器会自动将同样的参数以OPTIONS的请求方式对服务器进行请求:OPTIONS http://cat:1974/api/v1/sources/16162
当得到服务器端进行允许跨域的响应之后,才会按照我们指定的方式进行请求,如下图:
2. 服务器端(cherrypy):
假设服务器端有如下的可被访问的资源:
class sources:
exposed = True
def OPTIONS():
# 跨域处理
def PUT(id):
# 跨域处理
# do something
def GET(start, count):
# 跨域处理
# do something
cherrypy会对跨域请求的url进行一系列的前处理,获取到所请求的方法名以及参数,找到相匹配的方法进行分配
如上中举的例子,当cherrypy获取到请求OPTIONS http://cat:1974/api/v1/sources/16162时,
它会根据url所指定的请求资源(sources),方法(OPTIONS),以及相应参数(start),找到相对应的方法,
但是由于相应的OPTIONS方法参数列表为空,与请求的参数start不匹配,所以cherrypy认为没有合适的资源,直接响应404,如下图:
2.1 所以使用cherrypy实现rest api跨域时,需要考虑到参数列表的情况,
上面的情况可以将OPTIONS和GET的参数列表设为一样即可:
def OPTIONS(start)
2.2 但是这样只能解决带有一个参数的请求跨域的情况,
如果浏览器发送的是GET http://cat:1974/api/v1/sources/0/10 这样的多参数的请求,则会有同样的问题,
这里可以用到python的可变参数*arg:
def OPTIONS(*arg)
这样的话,不管OPTION有多少个参数,都能请求成功了
2.3 另外,上面举的例子都是rest风格的url,如果换为标准的HTTP GET风格的url就需要使用**kwargs了,
如GET http://cat:1974/api/v1/sources?start=0&count=10
3. 最后的解决方案:
def OPTIONS(*args, **kwargs)