Posting Form Values With The ColdFusion CFHttp And CFHttpParam Tags

Posted November 1, 2006 at 7:29 AM

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:

 Launch code in new window » Download code as text file »

  • <!--- 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:

 Launch code in new window » Download code as text file »

  • <!--- 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.

Download Code Snippet ZIP File

Post Comment  |  Ask Ben  |  Permalink  |  Other Searches  |  Print Page





Reader Comments

Sami Hoda
Nov 1, 2006 at 3:48 PM // reply »
18 Comments

Ben,

Take a look at aSyncHttp...

http://www.compoundtheory.com/?action=asynchttp.index

Sami


Nov 1, 2006 at 4:14 PM // reply »
6,371 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.


Nov 2, 2006 at 2:51 PM // reply »
16 Comments

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>


Dallas
Jan 23, 2009 at 9:33 PM // reply »
2 Comments

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!


Feb 6, 2009 at 9:32 AM // reply »
6,371 Comments

@Dallas,

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

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


Dallas
Feb 6, 2009 at 9:50 AM // reply »
2 Comments

@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.


Feb 6, 2009 at 9:56 AM // reply »
6,371 Comments

@Dallas,

Ok, good to hear.


Shivakarthikeyan
Jul 7, 2009 at 8:31 AM // reply »
1 Comments

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 ?


Jul 7, 2009 at 9:24 AM // reply »
6,371 Comments

@Shivakarthikeyan,

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


Post Comment  |  Ask Ben

Recent Blog Comments
Nov 7, 2009 at 5:53 PM
Ask Ben: Javascript String Replace Method
You can find here an advanced function that prepared with javascript replace function. This can make the first letters of words, sentences, lines and whatever you define automatically: http://www.m ... read »
Andrew Neely
Nov 7, 2009 at 4:56 PM
A Moment That Touched Me - The Fountainhead
Ben, Glad you enjoyed the podcast. Yeah, the Tank Riot guys can get really chatty during the episodes, but that's part of the charm of it for me. They've covered everything from Nichola Tesla to Cha ... read »
Nov 7, 2009 at 4:43 PM
Building A Fixed-Position Bottom Menu Bar (ala FaceBook)
Is it possible to make some more MenĂ¼`s ? ... read »
Jill
Nov 7, 2009 at 11:40 AM
How To Unformat Your Code (Like A Pro)
Derek, I think you might be right - sweet! Thanks for the link :) ... read »
Nov 7, 2009 at 11:25 AM
How To Unformat Your Code (Like A Pro)
I think it would be way easier to just use this http://www.logichammer.com/html-formatter/ He just released v3 and it rocks. ... read »
Jill
Nov 7, 2009 at 7:58 AM
How To Unformat Your Code (Like A Pro)
LMAO - this was pretty funny! I have to admit - I also love to reformat code so I can read it. My boss used to tell me to leave my OCD at home. Now I don't feel so bad after reading everyone else' ... read »
Nov 6, 2009 at 10:10 PM
How To Unformat Your Code (Like A Pro)
The timing of this post is just uncanny. I spent the last 15-20 minutes manually un-formatting my "Ben Nadel" style code within a CFC of mine. I was really digging the readability a few weeks ago, bu ... read »
Roe
Nov 6, 2009 at 5:11 PM
Passing Arrays By Reference In ColdFusion - SWEEET!
ArraySort also reorders the results of these java obj's ... read »