我可以通过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
失败。为什么呢?
答案 0 :(得分:268)
curl
发送默认内容类型为application/x-www-form-urlencoded
的POST请求。如果要发送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
。
答案 1 :(得分:1)
要阐明如何实际指定包含要发布的 JSON 的 文件,请注意它带有 @
符号,如 OP 中所示
例如本地 .NET Core API 的典型帖子:
curl -X POST https://localhost:5001/api -H "Content-Type: application/json" -d @/some/directory/some.json