Need to see if your shared folder is taking up space on your dropbox 👨‍💻? Find out how to check here.

Forum Discussion

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

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.

7 Replies

Replies have been turned off for this discussion
  • Здравко's avatar
    Здравко
    Legendary | Level 20
    3 years ago

    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 Community Moderator rankDropbox Community Moderator
    3 years ago

    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
    3 years ago

    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
    3 years ago

    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.

  • Greg-DB's avatar
    Greg-DB
    Icon for Dropbox Community Moderator rankDropbox Community Moderator
    3 years ago

    sr_c I see you're using fetch to perform the call, so make sure you're using the right options to construct the call as needed. As Здравко said, fetch expects a parameter named 'body' to set the request body, not 'data'.

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

    Hello  Здравко

    Your suggestion worked like a charm and I am able to upload files. Thanks a lot

    But I am wondering why Dropbox API documentation is showing 'data' instead of 'body' in the 'Example' (screen shot attached below)

     

  • Здравко's avatar
    Здравко
    Legendary | Level 20
    3 years ago

    The example on the page, you posted, uses 'curl' shell command. That's the way (one of all actually) body to be represented. You're working with 'fetch' command in javascript, not shell! Just different things! 😉 Pay attention on the proper documentation. None of these parameters (how they are named) can be seen by Dropbox server - just properly formated request is expected.

About Dropbox API Support & Feedback

Node avatar for Dropbox API Support & Feedback
Find help with the Dropbox API from other developers.

The Dropbox Community team is active from Monday to Friday. We try to respond to you as soon as we can, usually within 2 hours.

If you need more help you can view your support options (expected response time for an email or ticket is 24 hours), or contact us on X, Facebook or Instagram.

For more info on available support options for your Dropbox plan, see this article.

If you found the answer to your question in this Community thread, please 'like' the post to say thanks and to let us know it was useful!