我一直在尝试从开头使用用户名/密码的URL加载一些JSON。

因此,URL类似于:http://username:[email protected]/api/profiles/

我一直在使用greensock的DataLoader类,如果身份验证启动,它将返回错误#2032:流错误,但在禁用时加载正常。

我正在尝试添加“授权” URLRequestHeader来解决此问题?这是最好的前进方式吗?

如果相关,我将在Windows 7 Enterprise上使用FlashDevelop 4.0 / Flex SDK 4.5.1进行开发。

提前致谢!

编辑:

我正在尝试以类似于此帖子的方式使用 header :Flex 3 - how to support HTTP Authentication URLRequest?,但没有取得太大的成功。我正在使用的base64编码器来自:http://jpauclair.net/2010/01/09/base64-optimized-as3-lib/

2nd Edit:最新代码

_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);

最佳答案

基本身份验证在Flash中受到严格限制,尤其是在您希望使用API​​的情况下。我建议将请求包装在您自己的服务器上,在该服务器上可以实现基于 session 或基于密钥的身份验证。

例如。 http://api.your-domain.co.uk/api/profiles/?key=0123456789abdef将调用服务器端脚本,该脚本1)检查API密钥的有效性,以及2)从http://username:[email protected]/api/profiles/获取数据并将其返回。

如果您在API中使用的不是“/ api / profiles /”,我建议编写一个重写,该重写将接受任何路径并获取相应的远程路径。该脚本可以是服务器上支持的任何内容,从php脚本到bash脚本。

或者,如果您的服务器应用程序支持它,则您甚至可以使用mod_proxy之类的东西来设置反向代理。实际上,考虑到这一点,使用Apache或Lighttpd的反向代理可能是最简单的解决方案! (请参阅:http://httpd.apache.org/docs/2.0/mod/mod_proxy.html)

09-25 17:25