我一直在尝试从一个带有用户名/密码的URL加载一些JSON。
因此网址类似于:http://username:password@www.myaddress.org.uk/api/profiles/
我一直在使用来自greensock的DataLoader类,如果身份验证已启动,则会返回错误#2032:流错误但在禁用时会正常加载。
我正在尝试添加'授权'URLRequestHeader以解决此问题?这是最好的前进方式吗?
如果相关,我正在使用Windows 7 Enterprise上的FlashDevelop 4.0 / Flex SDK 4.5.1进行开发。
提前致谢!
修改
我试图以类似的方式使用标题:Flex 3 - how to support HTTP Authentication URLRequest?但我没有取得多大成功。我正在使用的base64编码器来自:http://jpauclair.net/2010/01/09/base64-optimized-as3-lib/
第二次修改:最新代码
_loader = new DataLoader(ENDPOINT, { onComplete:handleComplete, onError:handleError, onFail:handleFail } );
_loader.request.method = URLRequestMethod.POST;
_loader.request.data = new URLVariables("required=RandomData");
var bytes:ByteArray = new ByteArray();
bytes.writeUTFBytes(USER+':'+PASS);
var headerString:String = Base64.encode(bytes);
var header:URLRequestHeader = new URLRequestHeader('Authorization', 'Basic ' + headerString );
_loader.request.requestHeaders.push(header);
_loader.load();
的crossdomain.xml
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy
SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" />
<allow-http-request-headers-from domain="*" headers="Authorization" />
</cross-domain-policy>
编辑3 我也尝试过使用URLLoader:
var urlRequest:URLRequest = new URLRequest(ENDPOINT);
urlRequest.method = URLRequestMethod.POST;
urlRequest.data = new URLVariables("required=RandomData");
var bytes:ByteArray = new ByteArray();
bytes.writeUTFBytes(USER+':'+PASS);
var headerString:String = Base64.encode(bytes);
var header:URLRequestHeader = new URLRequestHeader('Authorization', 'Basic ' + headerString );
urlRequest.requestHeaders.push(header);
_urlLoader = new URLLoader(urlRequest);
_urlLoader.addEventListener(Event.COMPLETE, temp_handleComplete);
_urlLoader.addEventListener(IOErrorEvent.IO_ERROR, temp_handleError);
答案 0 :(得分:1)
基本身份验证在Flash中受到很大限制,特别是如果您要使用API。我建议将请求包装在您自己的服务器上,您可以在其中实现基于会话或基于密钥的身份验证。
EG。 http://api.your-domain.co.uk/api/profiles/?key=0123456789abdef将调用服务器端脚本,1)检查API密钥的有效性,2)从http://username:password@www.myaddress.org.uk/api/profiles/获取数据并将其返回。
如果您使用的不仅仅是API中的“/ api / profiles /”,我建议编写一个可以接受任何路径并获取相应远程路径的重写。该脚本可以是您的服务器上支持的任何内容,从php脚本到bash脚本。
或者,如果您的服务器应用程序支持它,您甚至可以使用mod_proxy之类的东西来设置反向代理。实际上,现在我考虑一下,使用Apache或Lighttpd的反向代理可能是最简单的解决方案! (见:http://httpd.apache.org/docs/2.0/mod/mod_proxy.html)