POST请求的正文参数存在问题

时间:2019-08-14 08:24:42

标签: r json rest azure-devops httr

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

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

我是该网上论坛的管理员,因此拥有创建团队的权限,并且该网址正确无误,因为我可以通过GET请求返回数据。

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

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

在控制台上打印“ body”会返回

    {"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())

这将返回以下错误消息,而不是在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"

不幸的是,这是无法复制的,但是我想看看我是否犯了一个明显的错误。

谢谢。

2 个答案:

答案 0 :(得分:3)

我认为您的授权不一定有问题。我在Postman中测试了该剩余api,并通过了PAT进行了身份验证。测试的结果是可以成功创建团队。

enter image description here enter image description here

答案 1 :(得分:2)

感谢休·林提出的通过邮递员的建议。由此,我得到了我的授权令牌,并设法使我的请求生效。然后,我将代码段导出到cURL中,并使用https://curl.trillworks.com/#r将curl命令转换为R httr。

与我的早期方法的另一个区别是,我使用add_headers设置了Authorization,Host和Content Type,并在查询中设置了api版本。

下面的代码是我使用的;

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