当前位置:  开发笔记 > 编程语言 > 正文

使用Adobe Flex/AIR中的HTTPService对象进行HTTP基本身份验证

如何解决《使用AdobeFlex/AIR中的HTTPService对象进行HTTP基本身份验证》经验,为你挑选了2个好方法。

我正在尝试从Adobe AIR应用程序中请求需要基本授权标头的HTTP资源.我尝试手动将标头添加到请求中,以及使用setRemoteCredentials()方法设置它们,但无济于事.

这是代码:


    







但是,仍然会弹出标准的基本身份验证对话框,提示用户输入用户名和密码.我有一种感觉,我没有以正确的方式做到这一点,但我能找到的所有信息(Flex文档,博客,谷歌等)要么没有用,要么太模糊无法提供帮助.

任何黑魔法,哦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();
}

Bob Somers.. 13

最后得到了Adobe的一些关注并得到了答案.长HTTP身份验证标头的问题是,默认情况下,Base64Encoder类将每72个字符注入换行符.显然,这会导致base-64编码字符串的一大块被解释为新的标头属性,从而导致错误.

您可以通过设置(在上面的示例中)encoder.insertNewLines = false来解决此问题.默认设置为true.

我修复了上面的代码,以适用于任意长的身份验证字符串.



1> Bob Somers..:

最后得到了Adobe的一些关注并得到了答案.长HTTP身份验证标头的问题是,默认情况下,Base64Encoder类将每72个字符注入换行符.显然,这会导致base-64编码字符串的一大块被解释为新的标头属性,从而导致错误.

您可以通过设置(在上面的示例中)encoder.insertNewLines = false来解决此问题.默认设置为true.

我修复了上面的代码,以适用于任意长的身份验证字符串.


哇,谈论一个疯狂可怕的默认.谁写这个垃圾!?

2> verveguy..:

啊.痛苦,痛苦.纯粹的苦难.

虽然你已经弄清楚如何在打电话之前添加一个标题,但令人讨厌的事实是,在Flash /浏览器集成空间的某个深处,你的标题会被再次删除.

去年我在blogvet上的verveguy.blogspot.com

所以我揭开了真相.(我认为)它比人们想象的更痛苦

1 /所有HTTP GET请求都被剥离了标头.它不在Flex堆栈中,因此它可能是底层的Flash播放器运行时

2 /具有除内容类型以外的所有HTTP GET请求application/x-www-form-urlencoded都将转换为POST请求

3 /所有没有实际发布数据的HTTP POST请求都会转换为GET请求.见1/2 /

4 /所有HTTP PUT和HTTP DELETE请求都转换为POST请求.这似乎是Flash播放器所困的浏览器限制.(?)

实际上,这归结为如果你想在所有请求中传递头文件,你应该总是使用POST,你应该找到另一种方式来传达你"真正想要"的操作的语义.Rails社区已决定通过传递?_method=PUT/DELETE作为浏览器问题的工作4 /

由于Flash在GET上添加了精彩的标题剥离疼痛,我也将其?_method=GET用作解决方法.但是,由于它在3 /上运行,我传递一个虚拟对象作为编码的POST数据.这意味着我的服务需要忽略?_method=GET请求上的虚拟发布数据.

至关重要的是要了解2 /.这浪费了我一大堆时间.

我已经将所有这些处理构建到一个具有MXML标记支持的新RESTService类中,因此可以假装客户端不存在这种情况.

希望这有助于某人.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有