0

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

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

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

但是,当我将以下代码添加到我的视图中以测试应用程序时,它会返回 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. 列表状态
  3. 区域

从调试数据中我可以看到下划线得到了更改,我已经采用了这个更改的 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?
4

1 回答 1

0

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

参数的编码是一个“特征”。为防止这种情况发生,请不要将 params 对象传递给 send 方法。相反,手动构建请求字符串,如下所示:

var :myurl:String = "http://api.zoopla.co.uk/whatever?api_key=123&listing_status=45";
service.url = myurl;
service.send();
于 2012-11-07T20:40:32.637 回答