将对象从WebAPI返回到Flex

时间:2016-09-26 12:14:11

标签: flex asp.net-web-api

我是Flex新手,我正在编写一个MXML应用程序,它将从WebAPI服务接收信息并显示它。

到目前为止,我已经设法通过一个简单的字符串来实现这一点,但是如果我尝试返回一个复杂的对象,它将返回null。

这是我的代码,这是一个非常简单的形式:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flex/spark"
    xmlns:mx="library://ns.adobe.com/flex/mx"
    xmlns:acrs_surveys="services.acrs_surveys.*"
    xmlns:valueObjects="valueObjects.*"
    minWidth="955" minHeight="600">
    <s:layout>
        <s:VerticalLayout/>
        </s:layout>
    <fx:Script>
        <![CDATA[
            import mx.controls.Alert;
            import mx.rpc.events.ResultEvent;

            protected function button_clickHandler(event:MouseEvent):void
            {
                GetSurveyResult.token = acrs_surveys.GetSurvey(itemidTextInput.text);
            }

            protected function button2_clickHandler(event:MouseEvent):void
            {
                survey.SurveyId = surveyIdTextInput.text;
                survey.Title = titleTextInput.text;
            }

            protected function assignSurveyResult(event:ResultEvent):void
            {
                survey = event.result as Survey;
            }
        ]]>
    </fx:Script>
    <fx:Declarations>
        <s:CallResponder id="GetSurveyResult" result="assignSurveyResult(event)"/>
        <valueObjects:Survey id="survey"/>
        <acrs_surveys:Acrs_surveys id="acrs_surveys" fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)" showBusyCursor="true" />
    </fx:Declarations>
    <s:Form defaultButton="{button}">
        <s:FormItem label="Itemid">
            <s:TextInput id="itemidTextInput"/>
        </s:FormItem>
        <s:Button id="button" label="GetSurvey" click="button_clickHandler(event)"/>
    </s:Form>
    <s:Form defaultButton="{button2}">
        <s:FormHeading label="Survey"/>
        <s:FormItem label="Questions">
            <s:Label id="QuestionsLabel" text="Questions_type[]"/>
        </s:FormItem>
        <s:FormItem label="SurveyId">
            <s:TextInput id="surveyIdTextInput" text="{survey.SurveyId}"/>
        </s:FormItem>
        <s:FormItem label="Title">
            <s:TextInput id="titleTextInput" text="{survey.Title}"/>
        </s:FormItem>
        <s:Button id="button2" label="Submit" click="button2_clickHandler(event)"/>
    </s:Form>
</s:Application>

代码主要由Flash Builder的向导生成。 “Survey”类由Generate Service Call向导生成,包含三个属性 - GUID,Title和Question对象列表,这些属性也由同一向导定义。

当我运行代码时,不会发生错误,并且根据网络监视器,调用成功并返回数据。但是,当我在assignSurveyResult中破坏代码并检查调查对象时,结果为空。

如果我更改代码以使用仅将调查标题作为字符串返回的WebAPI调用,则它可以正常工作。它似乎只是不起作用的对象。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

在追踪Flex源代码后,我找到了解决方案。事实证明,Flash Builder生成的客户端代理代码已经将自己的XML数据反序列化为JSON,结果是反序列化的数据显示为“http://www.w3.org/2001/XMLSchema-instance”,无法转换为对象。

使用Generate Service Call向导时,会生成一个包,在我的例子中称为“services.acrs_surveys”。在这个包中有一个“_Super_Acrs_surveys()”类,它在头文件中声明了两个序列化器:

private static var serializer0:JSONSerializationFilter = new JSONSerializationFilter();
private static var serializer1:XMLSerializationFilter = new XMLSerializationFilter();

此类的构造函数设置将使用哪个序列化程序:

 operation = new mx.rpc.http.Operation(null, "GetSurvey");
 operation.url = "Get/{itemid}";
 operation.method = "GET";
 argsArray = new Array("itemid");
 operation.argumentNames = argsArray;         
 operation.serializationFilter = serializer0;
 operation.properties = new Object();
 operation.properties["urlParamNames"] = ["itemid"];
 operation.resultType = valueObjects.Survey;
 operations.push(operation);

请注意,operation.serializationFilter设置为serializer0,这是JSON序列化程序,即使此操作的数据实际上是XML。看来向导没有正确检测数据类型,因此问题。

我将序列化程序更改为serializer1,现在我的代码正常工作。

有趣的是,只有在XML中返回字符串的操作才被正确检测到,这就是我工作中提到的原因。