POST 请求的正文参数问题

Issue with Body Argument for POST request

我正在尝试通过 Devops REST API 在我们的 Azure Devops 实例中创建一个新团队。这是通过 R 完成的,包 'httr' 用于 POST 请求,'jsonlite' 用于 toJSON 函数。

我一直在利用 Microsoft (https://docs.microsoft.com/en-us/rest/api/azure/devops/core/teams/create?view=azure-devops-rest-5.1) 上的文档来正确构建请求,但一直收到 400 错误(错误请求)。

我是该组的管理员,因此拥有创建团队的权限,并且 url 是正确的,因为我可以通过 GET 请求 return 数据。

对于 body 参数,我使用以下代码;

    args <- list(name = "my new team")
    body <- toJSON(args, auto_unbox = TRUE)

正在向控制台打印 'body' returns

    {"name":"my new team"}

这看起来与 Microsoft 文档中的 JSON 请求正文一致。

POST 请求的代码如下;

    create.task <- POST(paste0("https://dev.azure.com/",org.id,"/_apis/projects/",
                   project.id,"/teams?api-version=5.1"), 
                   encode = "json", 
                   authenticate(username, token, type = "basic"), 
                   body = body,
                   verbose())

这将 return 显示以下错误消息,而不是在 Devops 中创建新团队。

    "HTTP/1.1 400 Bad Request
    <- Cache-Control: no-cache
    <- Pragma: no-cache
    <- Content-Length: 446
    <- Content-Type: application/json; charset=utf-8
    <- Expires: -1"

不幸的是,这不是可重现的,但我想看看我是否犯了一个明显的错误。

谢谢。

我觉得不一定是你的授权有问题。我在 Postman 中测试了这个 rest api 并使用 PAT 进行了身份验证。测试结果是可以成功创建team

感谢 Hugh Lin 建议通过 Postman。由此我获得了我的授权令牌并设法使我的请求生效。然后我在 cURL 中导出代码片段并使用 https://curl.trillworks.com/#r 将 curl 命令转换为 R httr。

与我早期方法的另一个区别是,我在查询中使用 add_headers 和 api-version 设置授权、主机和内容类型。

下面的代码是我用的;

require(httr)

headers = c(
  `Authorization` = 'Basic XXXXXXXXXXXXXXXX=',
  `Content-Type` = 'application/json',
  `Host` = 'dev.azure.com'
)

params = list(
  `api-version` = '5.1'
)

data <- toJSON(list(name = "My New Team"), auto_unbox = TRUE, pretty = TRUE)

res <- httr::POST(url = 'https://dev.azure.com/{organization}/_apis/projects/{projectId}/teams',
                  httr::add_headers(.headers=headers), 
                  query = params, 
                  body = data)

这成功创建了新团队。

> status_code(res)
[1] 201