8 Replies Latest reply on Mar 21, 2016 1:12 PM by 2Charlie

    Is this how to send json data?

    2Charlie Level 1

      I'm trying to send JSON data via CFHTTP. Is this all I need or do I need to do anything else? I want make sure I'm not missing anything.

       

      <cfhttp url="https://app.kb.com/api/head/comment.json" method="post" timeout="15" throwonerror="true" >
        <cfhttpparam type="url" name="_authbykey" value="56ec1f0123131c78636142d6"> 
         <cfhttpparam type="url" name="project_id" value="55c4ffd123131c527e294fe6">
         <cfhttpparam type="url" name="article_id" value="#artID#">
        <cfhttpparam type="url" name="content" value="#form.message#" />
         <cfhttpparam type="url" name="public_name" value="#form.name#" />
         <cfhttpparam type="url" name="public_email" value="#form.mailfrom#" />          
      </cfhttp>
      

      Thank you!

        • 1. Re: Is this how to send json data?
          Carl Von Stetten Adobe Community Professional & MVP

          Does it work?

          • 2. Re: Is this how to send json data?
            2Charlie Level 1

            I got no errors but I am unable to retrieve the data after I've sent it.

             

            <cfhttp url="https://app.kb.com/api/head/comment.json" method="post" timeout="15" throwonerror="true" >

              <cfhttpparam type="url" name="_authbykey" value="56ec1f1232131c78636142d6">

                 <cfhttpparam type="url" name="project_id" value="55c4ffd123131c527e294fe6">

                 <cfhttpparam type="url" name="article_id" value="#artID#">

                 <cfhttpparam type="url" name="content" value="#serializeJSON(form.message)#" />

                 <cfhttpparam type="url" name="public_name" value="#serializeJSON(form.name)#" />

                 <cfhttpparam type="url" name="public_email" value="#serializeJSON(form.mailfrom)#" />

            </cfhttp>

             

            I've tried the serializeJSON() but I'm not sure if that's all I need. I've read this thread at StackOverFlow and it seemed that I've to build the string myself. However, that thread was about two years ago. I wonder if there is any changes in ColdFusion that does not require me to build the string myself.

            • 3. Re: Is this how to send json data?
              Carl Von Stetten Adobe Community Professional & MVP

              You need to send everything as a JSON string inside of an <cfhttpparam type="body">.  This StackOverflow post may help: http://stackoverflow.com/questions/8932973/how-to-post-json-data-to-remote-api-using-coldf usion-cfhttp

              • 4. Re: Is this how to send json data?
                2Charlie Level 1

                Okay, this is what I have so far but I feel like it's not right.

                 

                <cfset jsonString ={

                          "fields" = {

                          "article_id" = "#artID#"

                          },

                          "fields" = {

                          "type" = "comment"

                          },

                          "fields" = {

                          "project_id" = "55c4ffd123131c527e294fe6"

                          }

                          "fields" = {

                          "article_id" = "#artID#"

                          },

                          "fields" = {

                          "conent" = "#form.message#"

                          },

                          "fields" = {

                          "public_name" = "#form.name#"

                          },

                          "fields" = {

                          "public_email" = "#form.mailfrom#"

                          }

                         }>

                  <cfif cgi.request_method eq "post">

                  <cfhttp url="https://app.kb.com/api/head/comment.json" method="post" timeout="15" throwonerror="true" >

                     <cfhttpparam type="body" name="body" value="#serializeJSON(jsonString)#" />

                  </cfhttp>

                 

                This is the comment object API that my JSON data needs to be in.

                 

                stdClass Object
                (
                  [valid] => 1
                  [data] => stdClass Object
                  (
                  [id] => 54f126ed7cb82991627b23f0
                  [type] => comment
                  [project_id] => 54b88f0ffe775aac57000001
                  [article_id] => 54b88f12bfe5a1601400001c
                  [author_id] => 52d9a8dbfe775ad80d000001
                  [content] => I'm a comment!
                  [public_name] =>
                  [public_email] =>
                  [user_submitted] => 1
                  [date_created] => 02/27/2015 9:24 pm EST
                  )
                )

                • 5. Re: Is this how to send json data?
                  Carl Von Stetten Adobe Community Professional & MVP

                  There's a couple of typos in your <cfset> code: "conent" instead of "content", and "article_id" is in there twice (but maybe one of them was supposed to be "author_id"???).

                   

                  Before sending the jsonString in your <cfhttp>, try dumping it out on your page to see if it is actually in the correct "structure" to match the API.  At the ColdFusion level, I think you want a single struct called "fields" with each of the fields as sub-structs. The whole thing needs to be wrapped in an outer struct too, but you've already got that part by defining jsonString as a struct.

                   

                  Take a closer look at that StackOverflow post I linked to previously, particularly the answer that got 12 votes.  I think it will point you in the right direction.

                  • 6. Re: Is this how to send json data?
                    2Charlie Level 1

                    Okay, I cleaned up some more. For some reason, I kept getting Element MESSAGE is undefined in FORM. Looks like it's having issue retrieving data from the form when it's in the CFSET tag. However, when it's in the cfhttpparam or other place, it's fine. Am I doing this right?

                     

                    <cfset jsonString ={

                              "fields" = {

                              "article_id" = "#artID#",

                              "type" = "comment",

                              "project_id" = "55c4ffd123131c527e294fe6",

                              "content" = "#form.message#",

                              "public_name" = "#form.name#",

                              "public_email" = "#form.mailfrom#"

                              }

                             }>

                    • 7. Re: Is this how to send json data?
                      2Charlie Level 1

                      I figured out the error but I'm not sure about the <cfhttpparam type="body"> tag. Since all the parameters are combined into one string, how do I specify the CFHTTPPARAM with type="body"? Do I need the "name" attribute? And if so, what should it be?

                      • 8. Re: Is this how to send json data?
                        2Charlie Level 1

                        The is what jsonString looks like when I dump:

                         

                        {

                            "DATA": {

                                "PUBLIC_NAME": "testUser",

                                "CONTENT": "This is my test comment...#6",

                                "PROJECT_ID": "55c4ffd123131c527e294fe6",

                                "ARTICLE_ID": "56c606e123131cb759485c6c",

                                "PUBLIC_EMAIL": "user@mysite.com",

                                "TYPE": "comment"

                            }

                        }