You might see that the Dropbox Community team have been busy working on some major updates to the Community itself! So, here is some info on what’s changed, what’s staying the same and what you can expect from the Dropbox Community overall.

Forum Discussion

sr_c's avatar
sr_c
Explorer | Level 3
2 years ago

save_url throws error "request body: could not decode input as JSON"

Hi

I am trying to upload files (pictures with .jpg extension) to my dropbox account (to a specific app folder). I am using Airtable scripting (Javascript) extension to upload files from Airtable  (which has these pictures as attachments)

As these attachments are in Airtable (available at individual URLs), I am using below dropbox URL

When I use Dropbox API explorer it is able save the file to the dropbox folder.
But when I use through Airtable scripting block I am getting below error,
"Error in call to API function "files/save_url": request body: could not decode input as JSON"
main part of the script attached below
--------------------------------------------------------
// set the endpoint and app token
let dropboxEndpoint = "https://api.dropboxapi.com/2/files/save_url";
let appToken = "<--my dropbox app token -->"
// set up the post options
let postOptions = {
method: "POST",
headers: {
"Authorization" : "Bearer " + appToken,
"Content-Type" : "application/json"
},
data: {
"path":"/myairsri/best_peacock.jpg",
"url":"<-- Airtable attachmet URL -->"
}
}
const postResults = await fetch(dropboxEndpoint, postOptions);
const jsonPost = await postResults.text();
console.log(jsonPost)
----------------------------------------------------
Please suggest how this can be resolved.
 
Thanks
Sr

  • sr_c wrote:
    ...
    },
    data: filedata
    }
    ...

    sr_c, When you are preparing a request body with appropriate data, you have to set those data. What actually is going on here? 🤔 You have already prepared request body (that you named as 'filedata' - incorrect name and probably confusing)! In this context instead of setting 'data', you have to set 'body'. 😉 Be more careful!

    Hope this helps.


  • sr_c wrote:
    ...
    "Error in call to API function "files/save_url": request body: could not decode input as JSON"
    main part of the script attached below
    --------------------------------------------------------
    ...
    let postOptions = {
    method: "POST",
    headers: {
    "Authorization" : "Bearer " + appToken,
    "Content-Type" : "application/json"
    },
    data: {
    "path":"/myairsri/best_peacock.jpg",
    "url":"<-- Airtable attachmet URL -->"
    }
    }
    const postResults = await fetch(dropboxEndpoint, postOptions);
    ...

    Hi sr_c,

    You have correctly set json type for the request payload, but where you're ensuring passed data in the body is correct JSON format? 🤔 Maybe passing something like processed body with 'JSON.stringify' can solve your issue. 😉

    By the way, you can use Dropbox SDK for Javascript to do the same.

    Good luck.

  • Greg-DB's avatar
    Greg-DB
    Icon for Dropbox Staff rankDropbox Staff

    sr_c As Здравко said, you'll need to make sure you're sending a JSON string. It doesn't look like you're doing so in your current code. We do recommend using the official Dropbox JavaScript SDK though, as it will do much of the work for you.

    • sr_c's avatar
      sr_c
      Explorer | Level 3

      Hi

      Based on the suggestion to use JSON.stringify, I tried to implement below solution but error remains same. Not sure whether this is the right way to implement the suggestion. Changes highlighted in blue

      ------------------------------------------------------------------------------------------

       
      let appToken = "<<App Token>>"
      let fileobj = {
                          "path":"/myairsri/best_peacock.jpg",
                         "url":urlval
                       }
      let filedata = JSON.stringify(fileobj)
      // set up the post options
      let postOptions = {
      method: "POST",
      headers: {
      "Authorization" : "Bearer " + appToken,
      "Content-Type" : "application/json"
      },
      data: filedata
      }
      Please let me know your suggestions
      Thanks
      • Здравко's avatar
        Здравко
        Legendary | Level 20

        sr_c wrote:
        ...
        },
        data: filedata
        }
        ...

        sr_c, When you are preparing a request body with appropriate data, you have to set those data. What actually is going on here? 🤔 You have already prepared request body (that you named as 'filedata' - incorrect name and probably confusing)! In this context instead of setting 'data', you have to set 'body'. 😉 Be more careful!

        Hope this helps.