2013-07-01 38 views
3

我是Coldfusion的绝对新手(迄今为止只有1天),而且我必须学习它的工作方式。我来自.NET的背景,所以我试图理解这一切。REST GET函数 - 以JSON形式返回结构体

我基本上只是想读取XML文件,并将其作为JSON返回。简单。

XML文件结构

<countries> 
    <country code="AU" name="Australia" /> 
    <country code="NZ" name="New Zealand" /> 
    <country code="US" name="United States" /> 
    <country code="UK" name="United Kingdom" /> 
</countries> 

我已经创建了我使用的是CFC使用CFSCRIPT针对REST服务。代码:

component restpath="locations" rest="true" 
{ 
    remote Array function getCountries() httpmethod="GET" 
    { 
     response = []; 
     xCountries = xmlParse(expandPath("/data/countries.xml")); 
     numItems = ArrayLen(xCountries.countries.XmlChildren); 

     for (i = 1; i LTE numItems; i++) 
     { 
      sCountries = StructNew(); 
      sCountries.code = xCountries.countries.country[i].XmlAttributes.code; 
      sCountries.name = xCountries.countries.country[i].XmlAttributes.name; 
      arrayAppend(response, sCountries); 
     } 

     return response; 
    } 
} 

使用这种技术,我在我的测试中获得了正确的响应,但我有这种奇怪的感觉,它可能是低效的。我只是在想,创建一个新的结构并将其添加到一个循环中的数组(完整的xml文件大约有100个项目)可能会很笨重。

事实上,我不确定使用结构是否是最好的方法。在.NET中,我创建了一个类,然后添加了它的属性。我在寻找类似于类的东西去了,我碰到一些东西,我创建了一个Countries.cfc文件:

component accessors="true" output="false" 
{ 
    property name="code" type="string"; 
    property name="name" type="string"; 
} 

我与这个有唯一的问题是,我不知道如何使用这个。你使用OOP这样的组件吗?或者上面的“结构”方法更好?

TL; DR;以上是达到此目的的最佳方法吗?在ColdFusion中有这种东西的最佳做法吗?

欢迎任何其他指针或建议。谢谢

回答

3

海事组织没有任何错误的方法,你已采取。任何CF开发人员都会很熟悉。 CF中没有原生的XML - >对象映射技术(如Java中的JAXB或.NET中的XML序列化或数据绑定),所以无论您做什么,您都将在代码中的某处读取循环。 取决于您希望国家代码列表发生更改的频率,您可以在应用程序范围中缓存要返回的结构,这意味着您只需解析XML一次即可。

在回答结构/对象问题,要么工作正常。历史上,CF中的对象实例化非常昂贵,所以结构化方法通常受到青睐。速度差异现在不太明显,所以要么是有效的。

我个人选择object/struct的标准是我是否需要在多个地方使用数据。如果这是我将在整个应用中使用并可能更新的内容,那么定义一个对象是值得的。如果我只是提供对特定函数唯一的只读数据,那么定义对象就像开销一样。

+0

我只是尝试一个简单的本地测试来比较对象与结构。尽管尺寸较大(由于xml中的属性名称与我在对象中设置的较短的名称相比),但我可以清楚地看到每次调用与结构之间的50-90毫秒差异,尽管尺寸较大。 – jzm

+0

有趣的观察。如果这是完整的100个项目,那么你每个对象支付0.5-1ms实例化,当我刚刚处理一个空值对象时,这在我看来有点沉重。我想上面添加到我的列表中的另一个规则是,我从不考虑在业务逻辑中创建单个对象的成本,但是在创建循环的情况下,您需要更仔细地考虑。您可以尝试将时间代码放入测试中,以确认它是创建的,而不是序列化需要时间,但我怀疑是这种情况 – barnyr