Skip to content

Instantly share code, notes, and snippets.

@ungoldman
Last active April 15, 2024 14:46
Show Gist options
  • Save ungoldman/11282441 to your computer and use it in GitHub Desktop.
Save ungoldman/11282441 to your computer and use it in GitHub Desktop.
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.

@laduke
Copy link

laduke commented Jul 13, 2022

Maybe run it through jq then pipe like in Gerst20051's previous reply

jq '{"data": .}' <./test.json | curl ...

i haven't tried it
https://stackoverflow.com/a/57438049

@moyamos
Copy link

moyamos commented Jul 16, 2022

@laduke Thank you. It works!

@ehsanashar
Copy link

What if I want to post a file(csv) along with json data? Is that possible? If so how can I do that? Ex:

curl --location --request POST 'abc.com/upload'
--header 'Authorization: Bearer '
--header 'Content-Type: application/json'
--data-raw '{
"user": {"email":"abx@xyz.com"},
"options": {"process":"order_lines","selection":"price","tolerance":"loose","target":"transport_orders"},
"import_file": "/path/to/file.csv"
}'

I want to achieve something like this, how can I do this?

@roneygomes
Copy link

@ehsanashar you want the JSON to contain the entire contents of the CSV under the import_file key? I'm not sure you can do that with cURL alone but it shouldn't be very dificult to glue a few shell commands together and achieve the same result.

@weimengxi
Copy link

Thanks a lot!

@san9dev
Copy link

san9dev commented Nov 20, 2023

What if I want to post a file(csv) along with json data? Is that possible? If so how can I do that? Ex:

curl --location --request POST 'abc.com/upload' --header 'Authorization: Bearer ' --header 'Content-Type: application/json' --data-raw '{ "user": {"email":"abx@xyz.com"}, "options": {"process":"order_lines","selection":"price","tolerance":"loose","target":"transport_orders"}, "import_file": "/path/to/file.csv" }'

I want to achieve something like this, how can I do this?

@ehsanashar if you use linux or macos try this in terminal:

curl -X POST 'http://localhost:3000/admin/news' \
-H 'Authorization: Bearer some.token.here'
-H 'Content-Type: application/json' \
-d '{"user": {"email":"[abx@xyz.com](mailto:abx@xyz.com)"}, \
"options": {"process":"order_lines","selection":"price","tolerance":"loose","target":"transport_orders"}, \
"import_file": "@/path/to/file.csv"}'

@JaSei
Copy link

JaSei commented Dec 4, 2023

Btw. curl supports json directly

from man curl:

--json
(HTTP) Sends the specified JSON data in a POST request to the HTTP server. --json works as a shortcut for passing on these three options:

           --data [arg]
           --header "Content-Type: application/json"
           --header "Accept: application/json"

          There is no verification that the passed in data is actual JSON or that the syntax is correct.

          If you start the data with the letter @, the rest should be a file name to read the data from, or a single dash (-) if you want curl to read the data from stdin. Posting data from a file named 'foobar' would thus be done with --json @foobar and to instead read the data from stdin, use --json @-.

          If this option is used more than once on the same command line, the additional data pieces will be concatenated to the previous before sending.

          The headers this option sets can be overridden with -H, --header as usual.

          --json can be used several times in a command line

          Examples:
           curl --json '{ "drink": "coffe" }' https://example.com
           curl --json '{ "drink":' --json ' "coffe" }' https://example.com
           curl --json @prepared https://example.com
           curl --json @- https://example.com < json.txt

          See also --data-binary and --data-raw. This option is mutually exclusive to -F, --form and -I, --head and -T, --upload-file. Added in 7.82.0.

@ungoldman
Copy link
Author

@JaSei this is true as of v7.82.0! That feature was released 2022-03-05, so older systems may still benefit from this older advice. 👴

refs:

@thejimbirch
Copy link

Thanks, this worked for loading a local file.

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

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