我正在尝试从 Adobe AIR 应用程序中请求需要基本授权标头的 HTTP 资源。我尝试手动将标头添加到请求中,以及使用 setRemoteCredentials() 方法设置它们,但无济于事。
这是代码:
<mx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;
private function authAndSend(service:HTTPService):void
{
service.setRemoteCredentials('someusername', 'somepassword');
service.send();
}
private function resultHandler(event:ResultEvent):void
{
apiResult.text = event.result.toString();
}
private function resultFailed(event:FaultEvent):void
{
apiResult.text = event.fault.toString();
}
]]>
</mx:Script>
<mx:HTTPService id="apiService"
url="https://mywebservice.com/someFileThatRequiresBasicAuth.xml"
resultFormat="text"
result="resultHandler(event)"
fault="resultFailed(event)" />
<mx:Button id="apiButton"
label="Test API Command"
click="authAndSend(apiService)" />
<mx:TextArea id="apiResult" />
但是,仍然会弹出一个标准的基本身份验证对话框,提示用户输入用户名和密码。我有一种感觉,我这样做的方式不对,但我能找到的所有信息(Flex 文档、博客、Google 等)要么没有用,要么太模糊,无法提供帮助。
任何黑魔法,哦 Flex 大师?谢谢。
编辑:将 setRemoteCredentials() 更改为 setCredentials() 会产生以下 ActionScript 错误:
[MessagingError message='Authentication not supported on DirectHTTPChannel (no proxy).']
编辑:经过 Adobe 的一些关注,问题解决了。有关完整说明,请参阅下面的帖子。此代码适用于任意长度的 HTTP 身份验证标头。
import mx.utils.Base64Encoder;
private function authAndSend(service:HTTPService):void
{
var encoder:Base64Encoder = new Base64Encoder();
encoder.insertNewLines = false; // see below for why you need to do this
encoder.encode("someusername:somepassword");
service.headers = {Authorization:"Basic " + encoder.toString()};
service.send();
}