【问题标题】:Array in body for httr POST request用于 httr POST 请求的正文中的数组
【发布时间】:2014-10-25 20:55:17
【问题描述】:

这个 curl 调用可以在 Digital Ocean 上创建一个新的水滴

curl -X POST "https://api.digitalocean.com/v2/droplets" \
   -d '{"name":"test3","region":"nyc2","size":"512mb","image":5562742,"ssh_keys":[89103]}' \
   -H "Authorization: Bearer $TOKEN" 
   -H "Content-Type: application/json"

但是,我无法让httr::POST() 请求仅在给出参数ssh_keys 时才能工作。在上述方法中,ssh_keys 参数如果给定,则必须是一个数组。

我假设参数列表可以传递给主体,例如,ssh_keys 参数在列表中

args <- list(name="test3", region="nyc2", size="512mb", image="5562742", ssh_keys=list(891111))
POST(url, config=auth, body=args)

我认为这是内部发生的事情:

jsonlite::toJSON(args)

[1] "{ \"name\" : [ \"test3\" ], \"region\" : [ \"nyc2\" ], \"size\" : [ \"512mb\" ], \"image\" : [ \"5562742\" ], \"ssh_keys\" : [ [ 89103 ] ] }"

我想这会起作用,但也许这不是正在发生的事情?摆弄POST 中的encode 参数似乎没有帮助。

curl 调用从终端运行,但使用 httr::POST() 我不断收到错误消息

您为 Droplet 创建指定了无效的 ssh 密钥 ID。

【问题讨论】:

    标签: r httr jsonlite


    【解决方案1】:

    在这种特定情况下,

    x <- jsonlite::toJSON(args, auto_unbox=TRUE)
    cat(x)
    

    似乎返回了正确的格式(假设问题不在于标题)所以它们

    POST(url, config=auth, body=x)
    

    应该发送正确的请求。

    【讨论】:

      【解决方案2】:

      可能是这样的:

      req <- POST(
          url = "https://api.digitalocean.com/v2/droplets",
          body = toJSON(args, auto_unbox=TRUE),
          add_headers (
              "Content-Type" = "application/json",
              "Authorization" = paste("Bearker", TOKEN)
          )
      )
      

      【讨论】:

      • 谢谢你,这几乎就在那里,但我仍然需要将ssh_keys 装箱在一个数组中,所以我必须unbox() 所有其他参数,但留下ssh_keys 装箱。另外,必须在POST()调用中设置encode='json'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      相关资源
      最近更新 更多