Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
post a JSON file with curl

How do you POST a JSON file with curl??

You can post a json file with curl like so:

curl -X POST -H "Content-Type: application/json" -d @FILENAME DESTINATION

so for example:

curl -X POST -H "Content-Type: application/json" -d @../data/cats.json http://localhost:8080/mSfvMwNAfj

you can post a little blob of geojson, like so:

curl -X POST -H "Content-Type: application/json" -d '{"type":"Feature","properties":{"COUNTY":"M","PRECINCT":4505.0,"AREA":24330472.48801},"geometry":{"type":"Polygon","coordinates":[[[-122.579029970781065,45.53373981165327],[-122.579036751674209,45.533742065313575],[-122.579532751335037,45.533906068395808],[-122.579961749295705,45.534067060396104],[-122.580146749064056,45.534114065074704],[-122.581902757566823,45.534772060883959],[-122.582770766094569,45.535128058282019],[-122.583461773870638,45.535383050711246],[-122.584275765662781,45.535596050402262],[-122.584926770675438,45.535732043153857],[-122.585534768605342,45.535823041352423],[-122.586393777046183,45.535863042628513],[-122.586845771939593,45.535841037753478],[-122.587166778711079,45.535850042847976],[-122.587593783117342,45.535829037919441],[-122.587900782381638,45.535804036638346],[-122.588290773918729,45.535750036812139],[-122.588704782064923,45.535671034778389],[-122.589196776268082,45.535561035548149],[-122.589239647326053,45.535550318867173],[-122.589320708749753,45.536124484404517],[-122.589304695035338,45.537268231315537],[-122.59947923271595,45.53740953002616],[-122.599372142997979,45.537656509885132],[-122.601520781310597,45.537617244011571],[-122.601391421360532,45.543541079913162],[-122.578671442407,45.552336859399695],[-122.578672106607101,45.55230042862145],[-122.578693794893084,45.551092987187559],[-122.578713188347777,45.549969468845575],[-122.579029970781065,45.53373981165327]]]}}' http://localhost:8080/mSfvMwNAfj

Don't try to post a big blob, your terminal will hate you and you will hate yourself. It will go on forever and ever.

Use the syntax above (curl -X POST -H "Content-Type: application/json" -d @FILENAME DESTINATION) to specify a file instead.

@snepal87
Copy link

snepal87 commented Feb 18, 2021

What if I need to change a value of a Json object while posting?

For example my filename.json is

{
"id": "abcd",
"name": "name"
"address": "street",
}

My "id" may not always be "abcd" and it can be dynamic.
I want to Post this Json file using the above Curl but I want to pass "id" as dynamic value every time I Post the Json. How do I do this?

@ungoldman
Copy link
Author

ungoldman commented Feb 18, 2021

@snepal87 sounds like you need to use a function.

https://linuxize.com/post/bash-functions/

good luck!

@hoffmanc
Copy link

hoffmanc commented Feb 22, 2021

:<3:

@SoCalBeachrunner
Copy link

SoCalBeachrunner commented Apr 15, 2021

Thanks. Cured my headache.

@ChosenMoren
Copy link

ChosenMoren commented Apr 24, 2021

How to know my destination?

@xoxwgys56
Copy link

xoxwgys56 commented May 27, 2021

Thank you very much 👍

@Fran-Rg
Copy link

Fran-Rg commented Jul 14, 2021

How would you handle special character in the filename? For example spaces or '(' I've tried single quoting them:
--data '@xyz (2).json' but I got "unexpected token '('"

@ungoldman
Copy link
Author

ungoldman commented Jul 14, 2021

@Fran-Rg I would guess you have to escape special characters, using \

@labuscpi
Copy link

labuscpi commented Jul 16, 2021

What if I need to change a value of a Json object while posting?

For example my filename.json is

{
"id": "abcd",
"name": "name"
"address": "street",
}

My "id" may not always be "abcd" and it can be dynamic.
I want to Post this Json file using the above Curl but I want to pass "id" as dynamic value every time I Post the Json. How do I do this?

@snepal87

#!/bin/bash

DESTINATION='https://????????'
FILE_NAME="post.json"

create_file () {

    {
        echo "{\"id\":\"$1\",\"name\":\"name\",\"address\":\"street\"}"
    } >"${FILE_NAME}"

}

create_file "abcd"

curl -X POST -H "Content-Type: application/json" -d @"${FILE_NAME}" "${DESTINATION}"

@laduke
Copy link

laduke commented Sep 28, 2021

I googled "curl post json file" and this is the #1 hit 🤙

@roneygomes
Copy link

roneygomes commented Oct 27, 2021

Many thanks!

@Gerst20051
Copy link

Gerst20051 commented Mar 3, 2022

You can cat the contents of a json file to curl via the --data-raw parameter

curl 'https://api.com/route' -H 'Content-Type: application/json' --data-raw "$(cat ~/.json/payload-2022-03-03.json | grep -v '^\s*//')"

Note: comments in the json file are filtered out via grep -v '^\s*//'

You can also pass the data to curl via stdin using grep or cat

grep -v '^\s*//' ~/.json/payload-2022-03-03.json | curl 'https://api.com/route' -H 'Content-Type: application/json' -d @-

cat ~/.json/payload-2022-03-03.json | grep -v '^\s*//' | curl 'https://api.com/route' -H 'Content-Type: application/json' -d @-

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment