238

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。为什么?

4

3 回答 3

403

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 输入时才有效。.jsonurl 末尾的可能只表示输出json,并不一定意味着它也会处理 json输入。API 文档应该会提示您是否这样做。

您得到 a401而不是其他错误的原因可能是因为服务器无法auth_token从您的请求中提取 。

于 2013-09-04T12:54:02.087 回答
6

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

例如,本地 .NET Core API 的典型帖子:

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

于 2021-06-01T06:13:13.817 回答
1

您可以通过参数将文件cat的内容jsoncurl--data-raw

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

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

您还可以将数据传递给curlvia stdinusinggrepcat

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

于 2022-03-03T16:13:50.080 回答