I'm trying to hack up some code that Bryan F. Hogan previously posted
(http://www.houseoffusion.com/cf_lists/cache.cfm/4/18/18459.htm)

It works fine as is but currently only returns yes/no.  I'm trying to
return the list of alternate addresses UPS returns but so far no luck.

I can return simple variables back to my calling page, but if I try to
pass back a struct or array - it bombs.

I've stripped out the main call to UPS and it's working and I can
create an array containing the data I want. I just can't seem to
return it...

I'm not very familiar with CFC's, etc so bear with me if I'm doing
something obviously dumb:

Original - works fine:

<CFCOMPONENT>
        <CFFUNCTION ACCESS="Remote" RETURNTYPE="Boolean" NAME="VerifyUPS">
                <CFARGUMENT NAME="LicenseNumber" REQUIRED="True" DEFAULT="" HINT="UPS Provided XML License Number">
                <CFARGUMENT NAME="UserID" REQUIRED="True" DEFAULT="" HINT="UPS Provided UserID">
                <CFARGUMENT NAME="Password" REQUIRED="True" DEFAULT="" HINT="UPS Provided Password">
                <CFARGUMENT NAME="City" REQUIRED="True" DEFAULT="" HINT="City to perform validation">
                <CFARGUMENT NAME="State" REQUIRED="True" DEFAULT="" HINT="2 Letter Code of US States">
                <CFARGUMENT NAME="Zip" REQUIRED="True" DEFAULT="" HINT="Standard 5 digit US Zip code">
                <CFARGUMENT NAME="Country" REQUIRED="True" DEFAULT="" HINT="1 for US 0 for other country">
                <CFARGUMENT NAME="FullName" REQUIRED="True" DEFAULT="" HINT="Full Name of Customer">
                <CFLOOP COLLECTION="#ARGUMENTS#" ITEM="ARGUMENT">
                        <CFSET ARGUMENTS[ARGUMENT]=TRIM(ARGUMENTS[ARGUMENT])>
                </CFLOOP>
                <CFTRY>
                        <CFIF ARGUMENTS.COUNTRY IS 1>
                                <CFOBJECT NAME="objXMLHTTP" CLASS="msxml2.ServerXMLHTTP" ACTION="" TYPE="COM">
                                <CFPARAM NAME="VARIABLES.CITYLIST" DEFAULT="">
                                <CFPARAM NAME="VARIABLES.STATELIST" DEFAULT="">
                                <CFPARAM NAME="VARIABLES.ZIPLIST1" DEFAULT="">
                                <CFPARAM NAME="VARIABLES.ZIPLIST2" DEFAULT="">  
                                <CFSCRIPT>
                                        InputXML='<?xml version="1.0"?><AccessRequest><AccessLicenseNumber>#ARGUMENTS.LICENSENUMBER#</AccessLicenseNumber><UserId>#ARGUMENTS.USERID#</UserId><Password>#ARGUMENTS.PASSWORD#</Password></AccessRequest><?xml version="1.0"?><AddressValidationRequest xml:lang="en-US"><Request><TransactionReference><CustomerContext>#ARGUMENTS.FULLNAME#-Customer Data</CustomerContext><XpciVersion>1.0001</XpciVersion></TransactionReference><RequestAction>AV</RequestAction></Request><Address><City>#ARGUMENTS.CITY#</City><StateProvinceCode>#ARGUMENTS.STATE#</StateProvinceCode><PostalCode>#ARGUMENTS.ZIP#</PostalCode></Address></AddressValidationRequest>';
                                        lResolve = 5 * 1000;
                                        lConnect = 5 * 1000;
                                        lSend = 15 * 1000;
                                        lReceive = 15 * 1000;
                                        objXMLHTTP.setTimeouts(lResolve, lConnect, lSend, lReceive);
                                        objXMLHTTP.open("POST","https://www.ups.com/ups.app/xml/AV",false);
                                        objXMLHTTP.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
                                        objXMLHTTP.send(InputXML);
                                </CFSCRIPT>
                                <CFSET VARIABLES.MYXML=XMLNEW()>
                                <CFSET VARIABLES.MYXML=XMLPARSE(OBJXMLHTTP.RESPONSETEXT)>
                                <CFSET VARIABLES.CITYRESULTS=XMLSEARCH(VARIABLES.MYXML,'AddressValidationResponse/AddressValidationResult/Address/City')>
                                <CFSET VARIABLES.STATERESULTS=XMLSEARCH(VARIABLES.MYXML,'AddressValidationResponse/AddressValidationResult/Address/StateProvinceCode')>
                                <CFSET VARIABLES.ZIPRESULTS=XMLSEARCH(VARIABLES.MYXML,'AddressValidationResponse/AddressValidationResult/PostalCodeLowEnd')>
                                <CFLOOP FROM="1" TO="#ARRAYLEN(VARIABLES.CITYRESULTS)#" INDEX="I">
                                        <CFSET VARIABLES.CITYLIST=VARIABLES.CITYLIST&','&VARIABLES.MYXML.AddressValidationResponse.AddressValidationResult[I].Address.City.xmltext>
                                </CFLOOP>
                                <CFLOOP FROM="1" TO="#ARRAYLEN(VARIABLES.STATERESULTS)#" INDEX="I">
                                        <CFSET VARIABLES.STATELIST=VARIABLES.STATELIST&','&VARIABLES.MYXML.AddressValidationResponse.AddressValidationResult[I].Address.StateProvinceCode.xmltext>
                                </CFLOOP>
                                <CFLOOP FROM="1" TO="#ARRAYLEN(VARIABLES.ZIPRESULTS)#" INDEX="I">
                                        <CFSET VARIABLES.ZIPLIST1=VARIABLES.ZIPLIST1&','&VARIABLES.MYXML.AddressValidationResponse.AddressValidationResult[I].PostalCodeLowEnd.xmltext>
                                        <CFSET VARIABLES.ZIPLIST2=VARIABLES.ZIPLIST2&','&VARIABLES.MYXML.AddressValidationResponse.AddressValidationResult[I].PostalCodeHighEnd.xmltext>
                                </CFLOOP>
                                <CFIF LEN(VARIABLES.CITYLIST)>
                                        <CFSET VARIABLES.CITYLIST=RIGHT(VARIABLES.CITYLIST,LEN(VARIABLES.CITYLIST)-1)>
                                </CFIF>
                                <CFIF LEN(VARIABLES.STATELIST)>
                                        <CFSET VARIABLES.STATELIST=RIGHT(VARIABLES.STATELIST,LEN(VARIABLES.STATELIST)-1)>
                                </CFIF>
                                <CFIF LEN(VARIABLES.ZIPLIST1)>
                                        <CFSET VARIABLES.ZIPLIST1=RIGHT(VARIABLES.ZIPLIST1,LEN(VARIABLES.ZIPLIST1)-1)>
                                        <CFSET VARIABLES.ZIPLIST2=RIGHT(VARIABLES.ZIPLIST2,LEN(VARIABLES.ZIPLIST2)-1)>
                                </CFIF>
                                <CFIF LISTFINDNOCASE(VARIABLES.CITYLIST,VARIABLES.CITY) AND LISTFINDNOCASE(VARIABLES.STATELIST,VARIABLES.STATE) AND VARIABLES.ZIP GTE VARIABLES.ZIPLIST1 AND VARIABLES.ZIP LTE VARIABLES.ZIPLIST2>
                                        <CFSET MYRETURN=True>
                                        <CFRETURN MYRETURN>
                                <CFELSE>
                                        <CFSET MYRETURN=False>
                                        <CFRETURN MYRETURN>
                                </CFIF>
                        <CFELSE>
                                <CFSET MYRETURN=True>
                                <CFRETURN MYRETURN>
                        </CFIF>
                        <CFCATCH TYPE="ANY">
                                <CFSET MYRETURN=True>
                                <CFRETURN MYRETURN>
                        </CFCATCH>
                </CFTRY>        
        </CFFUNCTION>
</CFCOMPONENT>

My altered code:

<CFCOMPONENT>
        <cffunction name="VerifyUPS" access="remote" returntype="Any">
                <CFARGUMENT NAME="LicenseNumber" REQUIRED="True" DEFAULT="" HINT="UPS Provided XML License Number">
                <CFARGUMENT NAME="UserID" REQUIRED="True" DEFAULT="" HINT="UPS Provided UserID">
                <CFARGUMENT NAME="Password" REQUIRED="True" DEFAULT="" HINT="UPS Provided Password">
                <CFARGUMENT NAME="City" REQUIRED="True" DEFAULT="" HINT="City to perform validation">
                <CFARGUMENT NAME="State" REQUIRED="True" DEFAULT="" HINT="2 Letter Code of US States">
                <CFARGUMENT NAME="Zip" REQUIRED="True" DEFAULT="" HINT="Standard 5 digit US Zip code">
                <CFARGUMENT NAME="Country" REQUIRED="True" DEFAULT="" HINT="1 for US 0 for other country">
                <CFARGUMENT NAME="FullName" REQUIRED="True" DEFAULT="" HINT="Full Name of Customer">
                <CFLOOP COLLECTION="#ARGUMENTS#" ITEM="ARGUMENT">
                        <CFSET ARGUMENTS[ARGUMENT]=TRIM(ARGUMENTS[ARGUMENT])>
                </CFLOOP>

                <CFOBJECT NAME="objXMLHTTP" CLASS="msxml2.ServerXMLHTTP" ACTION="" TYPE="COM">
                <CFSCRIPT>
                        InputXML='<?xml version="1.0"?><AccessRequest><AccessLicenseNumber>#ARGUMENTS.LICENSENUMBER#</AccessLicenseNumber><UserId>#ARGUMENTS.USERID#</UserId><Password>#ARGUMENTS.PASSWORD#</Password></AccessRequest><?xml version="1.0"?><AddressValidationRequest xml:lang="en-US"><Request><TransactionReference><CustomerContext>#ARGUMENTS.FULLNAME#-Customer Data</CustomerContext><XpciVersion>1.0001</XpciVersion></TransactionReference><RequestAction>AV</RequestAction></Request><Address><City>#ARGUMENTS.CITY#</City><StateProvinceCode>#ARGUMENTS.STATE#</StateProvinceCode><PostalCode>#ARGUMENTS.ZIP#</PostalCode></Address></AddressValidationRequest>';
                        lResolve = 5 * 1000;
                        lConnect = 5 * 1000;
                        lSend = 15 * 1000;
                        lReceive = 15 * 1000;
                        objXMLHTTP.setTimeouts(lResolve, lConnect, lSend, lReceive);
                        objXMLHTTP.open("POST","https://wwwcie.ups.com/ups.app/xml/AV",false);
                        objXMLHTTP.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
                        objXMLHTTP.send(InputXML);
                </CFSCRIPT>
                <CFSET VARIABLES.MYXML=XMLNEW()>
                <CFSET VARIABLES.MYXML=XMLPARSE(OBJXMLHTTP.RESPONSETEXT)>

                <CFSET VARIABLES.QUALITY=XMLSEARCH(VARIABLES.MYXML,'AddressValidationResponse/AddressValidationResult')>

                <!--- loop over XML and pull out needed parts of address --->
                <cfset JIM = ArrayNew(1)>
                <cfloop index="i" from="1" to="#ArrayLen(VARIABLES.QUALITY)#">
                <cfset JIM[i] = StructNew()>
                <cfset Jim[i].City = VARIABLES.MYXML.AddressValidationResponse.AddressValidationResult[i].Address.City.xmltext>
                <cfset Jim[i].StateProvinceCode = VARIABLES.MYXML.AddressValidationResponse.AddressValidationResult[i].Address.StateProvinceCode.xmltext>
                <cfset Jim[i].PostalCodeLowEnd = VARIABLES.MYXML.AddressValidationResponse.AddressValidationResult[i].PostalCodeLowEnd.xmltext>
                <cfset Jim[i].PostalCodeHighEnd = VARIABLES.MYXML.AddressValidationResponse.AddressValidationResult[i].PostalCodeHighEnd.xmltext>
                </cfloop>
        
                <CFRETURN JIM>
               
        </cffunction>
</CFCOMPONENT>

This doesn't work at all.  I can set JIM to a simple string and it
works fine:

<cfset Jim = VARIABLES.MYXML.AddressValidationResponse.AddressValidationResult[i].Address.City.xmltext>

But if it's an array. No go.

Could not perform web service invocation "VerifyUPS" because java.lang.NullPointerException

Help?!

Jim
[Todays Threads] [This Message] [Subscription] [Fast Unsubscribe] [User Settings]

Reply via email to