Copy link to clipboard
Copied
I'm not sure if I explain this correctly but I want to do multiple cfhttp requests and then combine them into one cfset variable and just do one DeserializeJSON(variable). Is this possible? If so, how do I go about it?
Copy link to clipboard
Copied
Not only does asking the same question more than once in more than one thread not get you help any faster, but it tends to annoy the other users. Please refrain from creating multiple posts/threads with the same question.
^_^
Copy link to clipboard
Copied
Are you referring to this thread, How to setup cfhttpparam that takes multiple values?
That thread was for accepting multiple parameters...more like accepting/retrieving values in comma delimited from dynamic parameters passing from the URL. And this thread is about multiple CFHTTP calls. Are they the same question? The API I'm using limits the number of results returned to only 5; therefore, I need multiple CFHTTP calls for additional results. If you think this is the same question then I'm sorry.
Copy link to clipboard
Copied
I apologize. I saw "cfhttp" and "multiple" and erroneously thought you were posting the same question.
^_^
Copy link to clipboard
Copied
Yes, it is doable but I would really need more info. You can do something as simple as:
<cfset variables.results = [] />
<cfhttp...></cfhttp>
<cfset arrayAppend(variables.results,{ headers:cfhttp.headers, filecontent:cfhttp.filecontent }) />
<cfhttp...></cfhttp>
<cfset arrayAppend(variables.results,{ headers:cfhttp.headers, filecontent:cfhttp.filecontent }) />
...
<cfoutput>#serializeJSON(variables.results)#</cfoutput>
Copy link to clipboard
Copied
Thanks, Steve. What you're posting is almost exactly what I'm looking for. Instead of #serializeJSON(variables.results)#, I'm doing #DeserializeJSON(variables.results)# and it's giving me the "Error in custom script module".
Copy link to clipboard
Copied
Then it sounds like you want something more along the lines of:
<cfset variables.results = {} />
<cfhttp...></cfhttp>
<cfset structAppend(variables.results,deserializeJSON(cfhttp.filecontent),true) />
<cfhttp...></cfhttp>
<cfset structAppend(variables.results,deserializeJSON(cfhttp.filecontent),true) />
...
<cfdump val="#variables.results#" />
Copy link to clipboard
Copied
Steve, it's getting close but it's not working correctly yet. It looks like instead of appending, it's replacing with the last/latest cfhttp calls instead of combining both cfhttp calls.
Copy link to clipboard
Copied
I found this documentation and I tried the "Merging structures using Coldfusion" example and it's not working either.
<cfset structObj1 = structNew() />
<cfset structObj1.key1 = "struct1, key1" />
<cfset structObj1.key2 = "struct1, key2" />
<cfdump var="#structObj1#" label="structObj1" />
<cfset structObj2 = structNew() />
<cfset structObj2.key1 = "struct2, key1" />
<cfset structObj2.key3 = "struct2, key3" />
<cfdump var="#structObj2#" label="structObj2" />
<cfset result = structAppend(structObj1, structObj2) />
<cfdump var="#structObj1#" label="structObj1" />
<cfoutput>structAppend() was successful: #result#<br/></cfoutput>
If I dump structObj1 and 2 indvidually then it works but if I tried to dump result, it just show "YES" and not the two structures combined.
Copy link to clipboard
Copied
I found this documentation from Adobe, Adobe ColdFusion 9 * StructAppend , and if I set the second structAppend to false, then it only shows the data from the frist structAppend. If set it to true then the second structAppend overwrites the first. So, what did I do wrong?
Copy link to clipboard
Copied
When you do a structAppend, the second struct is appended to the first. The return value is just the status of the operation, a boolean.
<cfset result = structAppend(structObj1, structObj2) />
<cfdump var="#structObj1#" label="structObj1 with structObj2 appended" />
Copy link to clipboard
Copied
The issue here is that the structure keys have the same name so the append is either saving the first or the second copy, depending on the overwrite option. I'm thinking you want an array of structures as opposed to a single structure:
<cfset variables.results = [] />
<cfhttp...></cfhttp>
<cfset arrayAppend(variables.results,deserializeJSON(cfhttp.filecontent),true) />
<cfhttp...></cfhttp>
<cfset arrayAppend(variables.results,deserializeJSON(cfhttp.filecontent),true) />
...
<cfdump val="#variables.results#" />
Copy link to clipboard
Copied
2Charlie wrote:
I'm not sure if I explain this correctly but I want to do multiple cfhttp requests and then combine them into one cfset variable and just do one DeserializeJSON(variable). Is this possible? If so, how do I go about it?
It is a puzzle why you would want to deserialize the result of a cfhttp call. Deserialization returns a complex object such as struct or array. But the result of a cfhttp is, in general, already a struct.
In any case, what you want to do is possible. You could bend it like this,
<cfhttp method="get" url="site1" result="res1">
<cfhttp method="get" url="site2" result="res2">
...
<cfhttp method="get" url="site5" result="res5">
<cfset cfhttpContent.site1=res1>
<cfset cfhttpContent.site2=res2>
...
<cfset cfhttpContent.site5=res5>
<cfset all5sitesJsoned = serializejson(cfhttpContent)>
<cfdump var="#deserializejson(all5sitesJsoned)#">
It might be more efficient to use a loop.