Ben Nadel
On User Experience (UX) Design, JavaScript, ColdFusion, Node.js, Life, and Love.
I am the chief technical officer at InVision App, Inc - a prototyping and collaboration platform for designers, built by designers. I also rock out in JavaScript and ColdFusion 24x7.
Meanwhile on Twitter
Loading latest tweet...
Ben Nadel at CFUNITED 2009 (Lansdowne, VA) with:

Posting Form Values With The ColdFusion CFHttp And CFHttpParam Tags

By Ben Nadel on
Tags: ColdFusion

There was a thread on CF-Talk yesterday about getting data from a CFHttp call and then posting it to another page using the CFHttp tag. This got me thinking and I realized that I have never posted data with ColdFusion's CFHttp tag, only retrieved it. Is there any better time to learn than the now?

To try this out, I made a page that takes the FORM scope and created response string based on the form fields. It is basically echoing what was submitted:

  • <!--- Set up response string buffer. --->
  • <cfset REQUEST.Response = CreateObject(
  • "java",
  • "java.lang.StringBuffer"
  • ).Init()
  • />
  •  
  • <!--- Loop over form collection and add to response string. --->
  • <cfloop item="strKey" collection="#FORM#">
  •  
  • <!--- Add key/value pair to response. --->
  • <cfset REQUEST.Response.Append(
  • IIF(
  • REQUEST.Response.Length(),
  • DE( "||" ),
  • DE( "" )
  • ) &
  • strKey & "=" &
  • FORM[ strKey ]
  • ) />
  •  
  • </cfloop>
  •  
  • <!---
  • Reset output and write response to page. Then, abort out
  • of page so that we ensure no other data is written to the
  • reponse stream.
  • --->
  • <cfcontent
  • type="text/plain"
  • reset="true"
  •  
  • /><cfset WriteOutput( REQUEST.Response.ToString() )
  •  
  • /><cfabort />

As you can see, for each variable in the FORM object, I add the key / value pair to a double-pipe delimited list. The IIF() statement in the Append() method call is just to ensure that I don't prepend the double pipe unless there is already data in the response buffer (a very nice use of IIF() if I may say so myself).

Then, I created a page that posts form variables to the previously created page:

  • <!--- Determine the URL to post to. --->
  • <cfset strUrl = (
  • "http://" &
  • CGI.http_host &
  • GetDirectoryFromPath( CGI.script_name ) &
  • "post.cfm"
  • ) />
  •  
  •  
  • <!--- POST data to url using CFHttp. --->
  • <cfhttp
  • url="#strUrl#"
  • method="POST"
  • result="objHttp">
  •  
  • <cfhttpparam
  • type="FORMFIELD"
  • name="last_name"
  • value="nadel"
  • />
  •  
  • <cfhttpparam
  • type="FORMFIELD"
  • name="first_name"
  • value="ben"
  • />
  •  
  • </cfhttp>
  •  
  • <!--- Output reponse string. --->
  • <cfset WriteOutput(
  • objHttp.FileContent
  • ) />

This gives me the output (I added the line breaks for readability):

FIELDNAMES=LAST_NAME,FIRST_NAME||
FIRST_NAME=ben||
LAST_NAME=nadel

Pretty cool stuff. It works just like they said it would. It even submits the FIELDNAMES variable. Cool beans.




Reader Comments

Sami,

Thanks for the link. I actually looked at that when I was learning about deleting scheduled tasks programmatically. It's cool that it exists, but it seems like a bit of an overkill for such a simple task. Why bring so much Java into it.

Frankly, the whole "Async" thing can be mimiced (mostly) by setting a timeout on the CFHttp tag to 1 second. Granted, it still has to wait one second before the CFHttp tag times out (without throwing an error), but this is pretty darn close to Async for most use cases.

But certainly for more complicated examples where you might be launching many many async tasks, the AsyncHTTP is probably the way to go.

Thanks.

From: http://cfdj.sys-con.com/read/230515.htm

<cfhttp url="http://del.icio.us/rss/psenn" method="get">
<cfset RSSObj = xmlParse(cfhttp.filecontent)>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>del.icio.us</title>
</head>
<body>
<cfoutput>
<!---<cfloop collection="#RSSObj.xmlRoot.xmlChildren[1]#" item="I">
#I#<br />
</cfloop>--->
<ul>
<cfloop from="2" to="#ArrayLen(RSSObj.xmlRoot.xmlChildren)#" index="I">
<cfset AnchorText = RSSObj.xmlRoot.xmlChildren[I].title.xmltext>
<cfset Destination = RSSObj.xmlRoot.xmlChildren[I].link.xmltext>
<cfset title = "">
<cfif StructKeyExists(RSSObj.xmlRoot.xmlChildren[I],"description")>
<cfset title = RSSObj.xmlRoot.xmlChildren[I].description.xmltext>
</cfif>
<cftry>
<cfset title = RSSObj.xmlRoot.xmlChildren[I].description.xmltext>
<cfcatch type="any">
<cfset title = "">
</cfcatch>
</cftry>
<li><a href="#Destination#" title="#title#">#AnchorText#</a></li>
</cfloop>
</ul>
</cfoutput>
</body>
</html>

Sorry to post on such an old post...but, I'm trying to cfhttp post to a java struts app on en external server. They need lowercase fieldnames and cfhttp sends uppercase fieldnames. Are you aware of a 'fix' for this? I've try everything I'd consider a trick and I'm almost convinced it can't be done. Let me know if you've run into this. Thanks!

@Dallas,

Have you tried putting an LCase() around the name of the fields?

<cfhttpparam type="formfield" name="#LCase( ... )#" value="" />

@Ben, Thanks for the reply. I tried Lcase(), but it turns out that the cert was throwing errors as it wasn't in trusted root. The Strut developer on the vendor side kept telling me I was passing uppercase vars. Anyway, found the problem, fixed by importing cert. Thanks again.

We have a issue while making http request(method=post). When we make a http request to a page.Most of the time we get desired result.

If desired response is shown , we receive the below header and response content from the page requested.

Header:
HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 Connection: close Date: Tue, 07 Jul 2009 11:01:37 GMT Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET
Charset: utf-8

If we don't get a desired repsonse, we receive the below header and response content from the page requested

Header:
HTTP/1.1 200 OK Connection: close Expires: Thu, 01 Jan 1970 00:00:00 GMT Content-Language: en-US Date: Tue, 07 Jul 2009 11:47:21 GMT Server: IBM_HTTP_Server/6.1.0.21 Apache/2.0.47 Pragma: no-cache Cache-Control: no-cache Content-Type: text/html; charset=ISO-8859-1

Charset: ISO-8859-1

Can you please help me , why get two types of headers and reponse for a single http request to page ?

@Shivakarthikeyan,

I am not sure why the headers would change. Do these headers actually change the way your calling page functions?

Ben,
What if you're doing this but submitting to a form validated with JS? I'm trying to log into a site where the Submit (login) button calls a JS function, which on further examination is passing JSON data. I just keep getting the log in page returned. I've tried with putting the username and password in the cfhttp request, as well as using POST and cfhttpparam elements. Shouldn't submitting the form using POST take care of all that?

Once I get into the site there's a ton of javascript and broken up pages. Do you know if CFHTTP would work with that? I have to imagine it would, but I'm thus far quite unfamiliar with it.

Thank you!

Has anyone noticed that if you try to post a string that exceeds 1,000,000 characters, it simply does not include the field with the request? ..and doesn't throw!

eg.
<cfscript>
var h = new http( url = "http://...", method = "post" );
h.addParam( type = "formField", name = "a", value = repeatString("a",5000) );
h.addParam( type = "formField", name = "b", value = repeatString("b",1000000) );
h.addParam( type = "formField", name = "c", value = repeatString("c",1000001) );
var p = h.send().getPrefix();
writeDump( var = p, abort = true );
</cfscript>

The "a" and "b" fields are present in the form scope of the recipient page. The "c" field is missing!