• NOTE: This code was not written by Vyew, is was contributed, and we can make no guarantee it actually works. Please feel free to email us at “support at vyew.com” if you find a better way to do it. Thanks.
<!--- ================= vyewAPI() function =========================== --->
<cffunction name="vyewAPI" returnType="struct" output="false">
	<cfargument name="cmd" type="string" required="yes">
	<cfargument name="sArgs" type="struct" required="yes">
	
	<cftry>
		<cfscript>
			// used to return API response; CFErrorType will let user know if this function call or api call fails
			returnStruct = structNew();
			returnStruct.CFErrorType = "";
 
			apikey = "MY_API_KEY";
			secret = "MY_SECRET";
			apiurl = "https://vyew.com/api";
 
			// CF does not natively use Epoch time, so convert
			epoch_time = DateDiff("s", DateConvert("utc2Local", "January 1 1970 00:00"), now());
		
			query = "cmd=#ARGUMENTS.cmd#";
 
			// --- break out the arguments for the query string
			for ( listPosition = 1 ; listPosition LTE listLen(sArgs.keyList) ; listPosition = (listPosition + 1) )
			{
				elementName = listGetAt(sArgs.keyList, listPosition);
				query = query & "&" & elementName & "=" & URLEncodedFormat(Evaluate("sArgs.#elementName#"));
			}
 
			query = query & "&key=#apikey#&time=#epoch_time#";
 
			/*	the CF hash() function returns an uppercase hex string, while most return lowercase,
				so LCase is needed to successfully match other languages (php for example) */
			hashString = query & secret;
			md5 = LCase(hash(hashString, "MD5"));
 
			requestUrl = "#apiurl#?#query#&md5=#md5#";
		</cfscript>
 
		<cfhttp url="#requestUrl#" method="get" timeout="5" result="apiResponse">
 
		<!--- custom error if cfhttp call fails --->
		<cfif apiResponse.errorDetail NEQ "">
			<cfthrow type="cfhttp" message="Vyew API call failure." detail="#apiResponse.errorDetail#">
		<!--- custom error if Vyew API call returns an error --->
		<cfelseif ListFirst(apiResponse.fileContent, "|") NEQ 1>
			<cfset successMessage = ListGetAt(apiResponse.fileContent, 2, "|")>
			<cfthrow type="VyewAPI" message="API request to Vyew returned an error." detail="#successMessage#">
		<cfelse>
			<cfscript>
				returnStruct.successCode = ListFirst(apiResponse.fileContent, "|");
				returnStruct.successMessage = ListGetAt(apiResponse.fileContent, 2, "|");
				returnStruct.successBody = ListLast(apiResponse.fileContent, "|");
			</cfscript>
		</cfif>
 
		<cfcatch type="Any">
			<cfscript>
				returnStruct.CFErrorType = CFCATCH.type;
				returnStruct.CFErrorMessage = CFCATCH.message;
				returnStruct.CFErrorDetail = CFCATCH.detail;
			</cfscript>
		</cfcatch>
	</cftry>
 
	<cfreturn returnStruct>
</cffunction>
 
<!--- ================= Example Usage =========================== --->
<!--- Structure of arguments --->
<cfset sArgs = structNew()>
<cfset sArgs.email = "my@address.com">
<cfset sArgs.pw = "pass">
 
<!---	this is necessary because CF unfortunately stores struct key names internally as all caps. Some of the Vyew
		functions are camel hump style (import:dontWaitForConvert) and they are case sensitive, so conversion from 
		struct key names is impossible. --->
<cfset sArgs.keyList = "email,pw">
 
<!--- Call the API --->
<cfset vyewResponse = vyewAPI("login", sArgs)>
 
<!--- If there were errors, display them --->
<cfif vyewResponse.CFErrorType NEQ "">
	<cfoutput>#vyewResponse.CFErrorMessage#<br>#vyewResponse.CFErrorDetail#<br></cfoutput>
<cfelse>
	<!--- for login example, successful login returns URL to forward user to --->
	<cflocation url="#vyewResponse.successBody#">
</cfif>
 
api/serverside/coldfusion.txt · Last modified: 2009/10/01 11:34 by simadmin     Back to top