I thought I could write a tutorial for creating a basic
coldfusion web service illustrating the possibilities of using
reusable component rather than having lots of queries retrieving
(in most of the cases) the same data.
Let's say there are 5 articles in a B&O database, each time
the article is visited, a DB field visited is increased by 1
(obviously only once for 1 unique IP address). For instance the
article Multiple Files Upload has been visited 290 times, Easy and
secure way to retrieve data from a database (340) and Creating a
newsfeed generator was visited 95 times.
We may create a coldfusion reusable component to get the most
popular link along with some different stuff such as total number
of vists etc:
//articles.cfc
<cfcomponent displayname="Web Service CFC Example">
//get a total_visits value for every article in a database
<cfquery name="get_visits" datasource="#DSN#">
SELECT article_title, total_visits FROM articles
</cfquery>
<cfproperty name="name" type="string">
<cfset this.name="Web Service CFC Example">
<cffunction name="totalVisits" access="public" returntype="numeric">
<cfset total="0">
<cfloop query="get_visits">
<cfset total = total + #visits#>
</cfloop>
<cfreturn total>
</cffunction>
//check, which article is the most popular
<cffunction name="winningArticle" access="public" returntype="string">
<cfset maximum = 0>
<cfset winner = "unknown">
<cfloop query="get_visits">
<cfif #visits# gt maximum>
<cfset maximum = #visits#>
<cfset winner = #article_title#>
</cfif>
</cfloop>
<cfreturn winner>
</cfcomponent>
It's worth to mention, that I might add an additional function
in above component that returns the results as a structure
(preferable way), in such case you would need to incorporate
following code. I am going to write an additional tutorial
explaining in detail how to use CFC structures.
<cffunction name="allResults" access="public" returntype="struct">
<cfset all = structNew()>
<cfloop query="get_visits">
<cfset result = structInsert(all,#article_title#,#visits#)
</cfloop>
<cfreturn all>
</cffunction>
The structure is basically a collection of data which is a bit
more complex than a simple string or number.
Now, as the component is created, here's a way to call it and
retire the result.
//links.cfm
Total visits:
<cfinvoke component="articles.cfc" method="totalVisits"
returnvariable="total">
<cfoutput>#total#</cfoutput>
The most popular article:
<cfinvoke component="articles.cfc" method="winningArticle"
returnvariable="winner">
<cfoutput>#winner#</cfoutput>
Tagged: coldfusion
web service