Google.cfc v0.3

Why

It took me a few hours to make the Google API work with Cold Fusion. The results of the search API are a complex java object, so there seemed a need for translating this to something more coldfusion native.

Usage

<cfinvoke component="lab.cf.google.google" method="search" returnvariable="googleResults" >
  <cfinvokeargument name="q" value="uzilla"/>
  <cfinvokeargument name="start" value=1/>
  <cfinvokeargument name="maxResults" value="10"
  <cfinvokeargument name="key" value="...">
</cfinvoke>

The search method returns an array of structures with the following keys:

CACHEDSIZE
HOSTNAME
SNIPPET
SUMMARY
TITLE
URL

Change Notes

  • v0.3: Added ability to query for more than just 10 records. Note, for every 10 retrieved, you will use one of your 1000 daily allotted queries.

Source

google_cfc.zip

License

google.cfc is licensed under the Mozilla Public License. If you improve it, you are obligated to share your enhancements.

Future Work

Additional development might support more methods of the google api, optionally return a query instead of a struct. What else? Built-in caching?

Feedback to andyed(at)surfmind.com.

Sample Query: Top Twenty Results for "cold fusion blog" (with filter on)

Error Occurred While Processing Request The web site you are accessing has experienced an unexpected error.
Please contact the website administrator.


The following information is meant for the website developer for debugging purposes.
Error Occurred While Processing Request

Could not generate stub objects for web service invocation.

Name: http://api.google.com/GoogleSearch.wsdl. WSDL: http://api.google.com/GoogleSearch.wsdl. org.xml.sax.SAXException: Fatal Error: URI=null Line=2: Open quote is expected for attribute "lang" associated with an element type "html". It is recommended that you use a web browser to retrieve and examine the requested WSDL document for correctness. If the requested WSDL document can't be retrieved or it is dynamically generated, it is likely that the target web service has programming errors.
 
The error occurred in D:\Inetpub\surfmind\lab\cf\google\google.cfc: line 65
Called from D:\Inetpub\surfmind\lab\cf\google\index.cfm: line 89
Called from D:\Inetpub\surfmind\lab\cf\google\google.cfc: line 65
Called from D:\Inetpub\surfmind\lab\cf\google\index.cfm: line 89
63 : 			<cfinvokeargument name="ie" value="UTF-8"/>
64 : 			<cfinvokeargument name="oe" value="UTF-8"/>
65 : 			<cfinvokeargument name="restrict" value=""/>
66 : 		</cfinvoke>
67 : 		<cfset results = aGoogleSearchResult.getResultElements()>

Resources:

Browser   CCBot/1.0 (+http://www.commoncrawl.org/bot.html)
Remote Address   38.107.179.207
Referrer  
Date/Time   03-Feb-12 09:19 PM
Stack Trace
at cfgoogle2ecfc1766181518$funcSEARCH.runFunction(D:\Inetpub\surfmind\lab\cf\google\google.cfc:65) at cfindex2ecfm1811629236.runPage(D:\Inetpub\surfmind\lab\cf\google\index.cfm:89) at cfgoogle2ecfc1766181518$funcSEARCH.runFunction(D:\Inetpub\surfmind\lab\cf\google\google.cfc:65) at cfindex2ecfm1811629236.runPage(D:\Inetpub\surfmind\lab\cf\google\index.cfm:89)

org.xml.sax.SAXException: Fatal Error: URI=null Line=2: Open quote is expected for attribute "lang" associated with an  element type  "html".
	at org.apache.axis.utils.XMLUtils$ParserErrorHandler.fatalError(XMLUtils.java:723)
	at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
	at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
	at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
	at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
	at org.apache.xerces.impl.XMLScanner.scanAttributeValue(Unknown Source)
	at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanAttribute(Unknown Source)
	at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
	at org.apache.xerces.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(Unknown Source)
	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
	at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
	at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
	at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
	at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
	at org.apache.axis.utils.XMLUtils.newDocument(XMLUtils.java:369)
	at org.apache.axis.utils.XMLUtils.newDocument(XMLUtils.java:388)
	at coldfusion.xml.rpc.XmlRpcServiceImpl.retrieveWSDL(XmlRpcServiceImpl.java:651)
	at coldfusion.xml.rpc.XmlRpcServiceImpl.access$000(XmlRpcServiceImpl.java:51)
	at coldfusion.xml.rpc.XmlRpcServiceImpl$1.run(XmlRpcServiceImpl.java:208)
	at java.security.AccessController.doPrivileged(Native Method)
	at coldfusion.xml.rpc.XmlRpcServiceImpl.registerWebService(XmlRpcServiceImpl.java:201)
	at coldfusion.xml.rpc.XmlRpcServiceImpl.getWebService(XmlRpcServiceImpl.java:475)
	at coldfusion.xml.rpc.XmlRpcServiceImpl.getWebServiceProxy(XmlRpcServiceImpl.java:430)
	at coldfusion.tagext.lang.InvokeTag.doEndTag(InvokeTag.java:381)
	at cfgoogle2ecfc1766181518$funcSEARCH.runFunction(D:\Inetpub\surfmind\lab\cf\google\google.cfc:65)
	at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:344)
	at coldfusion.runtime.UDFMethod$ReturnTypeFilter.invoke(UDFMethod.java:290)
	at coldfusion.runtime.UDFMethod$ArgumentCollectionFilter.invoke(UDFMethod.java:254)
	at coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:56)
	at coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:207)
	at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:366)
	at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:198)
	at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:157)
	at coldfusion.runtime.CfJspPage._invoke(CfJspPage.java:1594)
	at coldfusion.tagext.lang.InvokeTag.doEndTag(InvokeTag.java:341)
	at cfindex2ecfm1811629236.runPage(D:\Inetpub\surfmind\lab\cf\google\index.cfm:89)
	at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:152)
	at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:349)
	at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65)
	at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:225)
	at coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:51)
	at coldfusion.filter.PathFilter.invoke(PathFilter.java:86)
	at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:69)
	at coldfusion.filter.BrowserDebugFilter.invoke(BrowserDebugFilter.java:52)
	at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28)
	at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38)
	at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)
	at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22)
	at coldfusion.filter.RequestThrottleFilter.invoke(RequestThrottleFilter.java:115)
	at coldfusion.CfmServlet.service(CfmServlet.java:107)
	at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:78)
	at jrun.servlet.FilterChain.doFilter(FilterChain.java:86)
	at com.intergral.fusionreactor.filter.FusionReactorFilter.c(FusionReactorFilter.java:428)
	at com.intergral.fusionreactor.filter.FusionReactorFilter.d(FusionReactorFilter.java:262)
	at com.intergral.fusionreactor.filter.FusionReactorFilter.doFilter(FusionReactorFilter.java:171)
	at jrun.servlet.FilterChain.doFilter(FilterChain.java:94)
	at com.seefusion.Filter.doFilter(Filter.java:40)
	at com.seefusion.SeeFusion.doFilter(SeeFusion.java:1160)
	at jrun.servlet.FilterChain.doFilter(FilterChain.java:94)
	at jrun.servlet.FilterChain.service(FilterChain.java:101)
	at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:91)
	at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42)
	at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:257)
	at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:541)
	at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:204)
	at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:318)
	at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:426)
	at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:264)
	at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)