Flex使用%5F作为HTTP服务的下划线?

时间:2012-11-04 12:20:28

标签: flex flash-builder httpservice

我目前正在使用Adobe Flex 4.6开发移动应用程序,我遇到了使用HTTP服务功能的问题。我正在尝试使用如下所示的HTTP请求:

http://api.somesite.co.uk/api/v1/data?api_key=00000aaaaa111111&area=London

我已使用数据菜单导入服务并使用参数需要对其进行测试,当我对服务运行测试时,它会将数据拉回并在“测试操作”视图中显示。

然而,当我然后在我的视图中添加以下代码来测试应用程序时,它返回一个2032错误:

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark"
        xmlns:myservice="services.myservice.*"
        initialize="view1_initializeHandler(event)" title="list">
    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;

            import spark.events.IndexChangeEvent;

            protected function view1_initializeHandler(event:FlexEvent):void
            {
                // TODO Auto-generated method stub
                var api_key:String = "00000aaaaa111111"
                var area:String = "London";

                listResult.addEventListener(ResultEvent.RESULT, onResult);
                listResult.addEventListener(FaultEvent.FAULT, httpFault);
                listResult.token = service.list(api_key, area);

                trace(listResult.token);
            }

            public function httpFault(event:FaultEvent):void { 
                var faultstring:String = event.fault.faultDetail; 
                trace("The Fault is: " + faultstring); 
            } 

            protected function onResult (event:ResultEvent):void
            {

            }

            protected function list_changeHandler(event:IndexChangeEvent):void
            {

            }

            protected function list_creationCompleteHandler(event:FlexEvent):void
            {

            }

        ]]>
    </fx:Script>
    <fx:Declarations>
        <s:CallResponder id="listResult" result="data=listResult.lastResult"/>
        <myservice:MyService id="service"/>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <s:List id="list" left="0" right="0" top="0" bottom="85" fontSize="20" contentBackgroundColor="#272727"
            creationComplete="list_creationCompleteHandler(event)" change="list_changeHandler(event)">
        <s:AsyncListView list="{data}"/>
        <s:itemRenderer>
            <fx:Component>
                <s:IconItemRenderer
                    labelFunction="Name"
                    iconFunction="getImageURL"
                    iconHeight="80"
                    iconWidth="80">
                    <fx:Script>
                        <![CDATA[
                            import valueObjects.Item;

                            private function Name(item: Object):String
                            {
                                var item:Item = Item(item);
                                return listing.name;
                            }

                            private function getImageURL(item: Object):String
                            {
                                var item:Item = Item(item);
                                return listing.image_url;
                            }

                        ]]>
                    </fx:Script>
                </s:IconItemRenderer>
            </fx:Component>
        </s:itemRenderer>
    </s:List>

</s:View>

通过上面的代码,我设法跟踪问题,因为从视图运行代码时出于某些未知的愚蠢原因,发送的url是错误的,下划线被%5F替换,如下所示:

http://api.somesite.co.uk/api/v1/data?area=London&api%5Fkey=00000aaaaa111111

任何人都可以帮我解决这个问题吗?

由于

编辑 ......

您好,

如果URL错误,我希望它在“测试操作”视图中运行时失败,但是它会返回预期的数据并且看起来都很好。它只有当我尝试将它应用到我得到问题的视图时才替换为传递的api_key的下划线。我正在使用的服务是位于以下网址的Zoopla服务:

http://developer.zoopla.com/docs/Property_listings

如果你能看到这个并让我知道,我正在通过3个参数:

  1. API_KEY
  2. listing_status
  3. 区域
  4. 从调试数据我可以看到下划线得到了更改,我已经使用了这个更改的url并尝试在另一个程序中运行它并且它失败了,但是当我只是将api%5Fkey部分更改为api_key并运行时它再次在其他程序中返回数据。所以我认为api_key下划线是问题,我不知道如何解决这个或为什么它不能在视图上工作,但在测试视图中?有什么想法吗?

    编辑2 ...

    我最近将代码更新为:

    protected function list_creationCompleteHandler(event:FlexEvent):void
    {   
        var params:Object = new Object();
        params.api_key = "MY_API_KEY";
        params.area = "London";
        params.listing_status = "rent";
        params.page_size = 100;
        srv.send(params);
    }
    
    <fx:Declarations>
        <s:HTTPService id="srv" url="http://api.zoopla.co.uk/api/v1/property_listings?"
                       method="GET" 
                       result="srv_resultHandler(event)" 
                       fault="srv_faultHandler(event)" useProxy="false"/>
    </fx:Declarations>
    

    当我使用上面的代码时,我在下面收到此错误,看起来代码正在以某种方式更改URL并创建一个新的混乱:-S

    错误是:

    Error: [IOErrorEvent type="ioError" bubbles=false cancelable=false eventPhase=2 text="Error #2032: Stream Error. URL: http://localhost:37813/api/v1/property_listings?&page%5Fsize=100&api%5Fkey=MY_API_KEY&area=London&listing%5Fstatus=rent?hostport=api.zoopla.co.uk&https=N&id=F91A1C6D-8E19-9F50-EAEF-05DA5601D98D" errorID=2032]. URL: http://api.zoopla.co.uk/api/v1/property_listings?
    

1 个答案:

答案 0 :(得分:0)

好的,所以首先应该处理另一端的服务器显然不是这样......

参数的编码是一个“特征”。要防止它,请不要将params对象传递给send方法。而是手动构建请求字符串,如下所示:

var :myurl:String = "http://api.zoopla.co.uk/whatever?api_key=123&listing_status=45";
service.url = myurl;
service.send();