如何通过JSON文件传递有效载荷卷曲?

我可以通过curl执行以下命令成功创建一个地方:

$ curl -vX POST https://server/api/v1/places.json -d "
auth_token=B8dsbz4HExMskqUa6Qhn& \
place[name]=Fuelstation Central& \
place[city]=Grossbeeren& \
place[address]=Buschweg 1& \
place[latitude]=52.3601& \
place[longitude]=13.3332& \
place[washing]=true& \
place[founded_at_year]=2000& \
place[products][]=diesel& \
place[products][]=benzin \
"

服务器返回HTTP/1.1 201 Created 现在我想将有效负载存储在一个JSON文件中,它看起来像这样:

// testplace.json
{
"auth_token" : "B8dsbz4HExMskqUa6Qhn",
"name" : "Fuelstation Central",
"city" : "Grossbeeren",
"address" : "Buschweg 1",
"latitude" : 52.3601,
"longitude" : 13.3332,
"washing" : true,
"founded_at_year" : 2000,
"products" : ["diesel","benzin"]
}

所以我修改命令执行如下:

$ curl -vX POST http://server/api/v1/places.json -d @testplace.json

返回HTTP/1.1 401 Unauthorized失败。为什么?

341274 次浏览

curl发送POST请求,默认内容类型为application/x-www-form-urlencoded。如果你想发送一个JSON请求,你必须指定正确的内容类型头:

$ curl -vX POST http://server/api/v1/places.json -d @testplace.json \
--header "Content-Type: application/json"

但这只有在服务器接受json输入时才有效。url末尾的.json可能只表明输出是json,这并不一定意味着它也将处理json 输入。API文档应该给您一个提示,告诉您它是否这样做。

你得到一个401而不是其他错误的原因可能是因为服务器不能从你的请求中提取auth_token

为了阐明如何实际指定一个包含要发布的JSON的文件,请注意它带有OP中所示的@符号

例如,一个典型的本地。net核心API的帖子:

curl -X POST https://localhost:5001/api -H "Content-Type: application/json" -d @/some/directory/some.json

你可以通过--data-raw参数将一个json文件的内容catcurl

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

curl https://api.com/route -H 'Content-Type: application/json' -d @<(jq . ~/.json/payload-2022-03-03.json)

curl https://api.com/route -H 'Content-Type: application/json' -d @<(jq '{"payload": .}' < ~/.json/payload-2022-03-03.json)

注意:json文件中的注释是通过grep -v '^\s*//'过滤掉的

你也可以使用grepcatjq通过stdin将数据传递给curl

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 @-

jq . ~/.json/payload-2022-03-03.json | curl https://api.com/route -H 'Content-Type: application/json' -d @-

jq '{"payload": .}' < ~/.json/payload-2022-03-03.json | curl https://api.com/route -H 'Content-Type: application/json' -d @-