Posting Form Values With The ColdFusion CFHttp And CFHttpParam Tags

Posted November 1, 2006 at 7:29 AM by Ben Nadel

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

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 »
10,640 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>


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 »
10,640 Comments

@Dallas,

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

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


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 »
10,640 Comments

@Dallas,

Ok, good to hear.


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 »
10,640 Comments

@Shivakarthikeyan,

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


Oct 3, 2011 at 4:19 PM // reply »
14 Comments

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!


Post A Comment

Comment Etiquette: Please do not post spam. Please keep the comments on-topic. Please do not post unrelated questions or large chunks of code. And, above all, please be nice to each other - we're trying to have a good conversation here.

Please review the following issues:

Author Name:


Author Email:

Author Website:

Comment:

Supported HTML tags for formatting: <strong>bold</strong>   <em>italic</em>   <code>code</code>







  • Help Wanted - Find Your Next ColdFusion Job
InVision App - Prototyping Made Beautiful With Prototyping Tools Ben Nadel's Company - Epicenter Consulting Recent Blog Comments
Feb 10, 2012 at 7:21 PM
jQuery AJAX Strips Script Tags And Inserts Them After Parent-Most Elements
Update! Instead of $(eval(options.insertAfter)).after(data['insertData']); I now use: var ajaxNode = document.createElement('span'); var parent = $(eval(options.insertAfter))[0].parentNode; ... read »
Feb 10, 2012 at 6:18 PM
jQuery AJAX Strips Script Tags And Inserts Them After Parent-Most Elements
encountered this same, what I consider, jQuery bug last week. I'm building a site in which I load some content via AJAX. This content contains Linkedin share button placeholders which Linkedin API ne ... read »
Feb 10, 2012 at 11:30 AM
Cross-Origin Resource Sharing (CORS) AJAX Requests Between jQuery And Node.js
After you understand the concepts here, this is an awesome cheatsheet for enabling CORS in just about anything http://enable-cors.org/ ... read »
JM
Feb 10, 2012 at 9:10 AM
My Safari Browser SQLite Database Hello World Example
@Amy, Here is a very good tutorial on how to use JOIN: http://www.sqltutorial.org/sqljoin-innerjoin.aspx ... read »
Feb 10, 2012 at 4:42 AM
Building A Twitter-Inspired RESTful API Architecture In ColdFusion
This is great, very useful Ben. I spotted a small typo in the api.cgm listing: <cfthrow type="Unauthroized" /> Cheers Stefan ... read »
Feb 9, 2012 at 10:35 PM
CFDirectory Filtering Uses Pipe Character For Multiple Filters (Thanks Steve Withington)
I was wondering if there would be a filter you could apply so that you got everything but what you included in the filter. As in show me all docs that are not a .pdf. ... read »
Feb 9, 2012 at 10:29 PM
Learning ColdFusion 9: Application-Specific Data Sources
@Ben, No offence, but if people were really wanting advanced features they would be using a platform like ASP.NET MVC. CFML is so structurally compromised as a tag-based scripting language that ... read »
Feb 9, 2012 at 10:03 PM
Subversion - Cleanup Failed To Process The Following Paths
@Leviaguirre, do you still have problems with this? ... read »