让 OE 的 XML-RPC 支持 Silverlight 和 Flash
-
昨晚 hack 搞定的,没时间细写了,大概说一下原理:
Silverlight 和 Flash 作为服务器插件,为了安全起见,就是防止 DDos 之类,限制不能做跨域 HTTP 请求,如果要允许跨域调用要在被请求的 web 服务器的根目录下放置 crossdomain.xml 并提供设置,SL 和 Flash 会先下载这个文件然后才决定是否允许请求。
OpenERP 的 xml-rpc 服务器用的是 Python 标准库的 SimpleXMLRPCServer,支持持 XML-RPC 调用的 POST 请求,并不是 web 服务器,不能用 GET 请求返回文件,但是 SimpleXMLRPCServer 提供了
SimpleXMLRPCRequestHandler 可以让我们自定义请求的处理器,所以,让我们自己加上 GET 请求的支持,返回 crossdomain.xml 文件:-
修改 netsvc.py,为 SimpleXMLRPCRequestHandler 类加上下面的方法:[code]
class SimpleXMLRPCRequestHandler(GenericXMLRPCRequestHandler, SimpleXMLRPCServer.SimpleXMLRPCRequestHandler):
rpc_paths = map(lambda s: '/xmlrpc/%s' % s, GROUPS.get('web-services', {}).keys())def do_GET(self):
#only allow a request for the crossdomain file
if self.path != '/crossdomain.xml':
self.send_response(403)
self.log_request(403)
return#open the crossdomain file and read its contents response = open('crossdomain.xml', 'r').read() #write the data to the socket along with valid HTTP headers self.send_response(200) self.send_header("Content-type", "text/xml") self.send_header("Content-length", str(len(response))) self.end_headers() self.wfile.write(response) self.log_request(200)
[/code]并在 OE 的 openerp-server/bin/ 目录下放上 crossdomain.xml,内容如下:[code]<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>[/code]我用 Silverlight3 在 Visual Studio 2010 下测试的,用了 code.google.com/p/xmlrpc-silverlight/ 提供的 XMLRPC 库。
OpenERP 的 XML-RPC 端口是 80,其他的我没测试。调用 [检测到链接无效,已移除] 方法的结果见附件图。
Flash 和 Silverlight 的 crossdomain.xml 是通用的,我对 Flash 无爱,各位能人请自行测试。
[[i] 本帖最后由 oldrev 于 2010-4-21 22:28 编辑 [/i]]
-