【问题标题】:How to pass payload via JSON file for curl?如何通过 JSON 文件传递​​有效载荷以进行 curl?
【发布时间】:2013-09-07 20:18:33
【问题描述】:

我可以通过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 失败。为什么?

【问题讨论】:

  • 另外请记住,如果您要上传二进制文件,则应使用--data-binary
  • 对于引用此问题以回答“我如何指定包含 JSON 的文件”的任何人,请注意它带有问题中给出的 @ 符号,例如$ curl -vX POST http://server/api/v1/places.json -d @testplace.json。这假设您正在从包含 testplace.json 的目录运行 curl - 否则使用例如 @/some/directory/some.json

标签: json curl


【解决方案1】:

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 可能只表示output 是json,并不一定意味着它也会处理json input。 API 文档应该会提示您是否这样做。

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

【讨论】:

  • 我试图在-d 之后使用cat file.json 并且遇到了麻烦,直到我从这个答案中了解到我可以使用@file.json。谢谢:)
  • 请注意,如果您需要多个标头,则需要多次指定 -H/--header,至少在 Ubuntu 上的 bash 中进行测试时如此。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-13
    • 2019-03-22
    • 2018-11-04
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多