【问题标题】:Jira Rest Api in PowershellPowershell 中的 Jira Rest Api
【发布时间】:2021-04-10 20:35:11
【问题描述】:

你能帮帮我吗?

我正在尝试使用 Powershell Invoke-WebRequest cmdlet 在 Jira 中创建问题。我收到 400 Bad Request 错误。

我能够使用 Postman 发送成功的请求,因此我确保正文语法正确并且我有足够的权限。

我的代码:

$body = @{ 
    "fields" = @{
            "project"=
            @{
                "key"= "ProjectKey"
            }
    
            "summary"= "Test"
    
            "description"= "Test"
            "issuetype" =@{
                "id"= "10705"
    
            }
            "priority"= @{
                "id"= "18"
            }
            "reporter"= @{"name"= "MyName"}
            
    }
    
    }
    
    
    $Headers =  @{
    Authorization = "Basic QWxla0Zblablablablablablabla" #I took it from Postman
    }
    
    $restapiuri = "https://jira.domain.com/rest/api/2/issue"
    
    Invoke-RestMethod -Uri $restapiuri -ContentType "application/json"  -Body $body -Method POST -Headers $Headers

比如我可以成功执行

Invoke-RestMethod "https://jira.domain.com/rest/api/2/issue/createmeta" -Headers $Headers 

我已经花了很多时间来解决这个问题,但仍然无法创建问题。

任何帮助,请????????????

【问题讨论】:

  • 我绝不是这方面的专家,但我认为您需要先ConvertTo-Json 您的$body,然后再将其传递给Invoke-RestMethod
  • Rno 是正确的。提交前,正文必须为 JSON 格式。
  • 我不知道删除我的评论是否正确,以免误导人们。 ConvertTo-Json 真的很有帮助。但是第一次没用,因为还有其他我不知道的错误,而且错误还是一样,比如我给一个元素赋值为字符串,而不是预期的int。因此,我决定 ConvertTo-Json 没有帮助。我很抱歉。
  • 我会删除它,正如你所说的误导

标签: powershell jira-rest-api invoke-restmethod


【解决方案1】:

对于使用 Jira SERVER 的基本身份验证,需要在标头中以 Base64 编码提供凭据,您需要在通过 Powershell Invoke-WebRequest 方法提供凭据之前执行此操作。操作方法如下:

$username = "The username here"
$password = "The password or token here"

# Convert the username + password into a Base64 encoded hash for basic authentication
$pair = "${username}:${password}"
$bytes = [System.Text.Encoding]::ASCII.GetBytes($pair)
$base64 = [System.Convert]::ToBase64String($bytes)
$headers = @{ Authorization = "Basic $base64" }

接下来,在 PowerShell 中,如果您将请求的主体构建为表格,就像您展示的那样,不需要用引号将表格元素包裹起来,只需保持原样即可,但是您在提交之前确实需要将表格转换为 JSON 格式,如下所示:

$body = @{
 fields = @{
   project = @{
    key = "ProjectKey"
   }
   issuetype = @{
    id = "10705" # Or refer to the Issue type by its name eg. name = "Story"
   }
   summary = "Test"
  }
}
# Convert the body to JSON format
$body = $body | ConvertTo-Json -Depth 50

我假设您的 $Uri 字符串包含 Jira 服务器的实际 URL,而不是示例 'jira.domain.com'

从正文中的一个简单请求开始,就像我展示的那样,它仅包含创建问题所需的最低要求,它将在使请求变得更复杂之前检查您的基本代码是否正常工作。

【讨论】:

  • 非常感谢您的帮助! ConvertTo-Json 真的帮助了我。我还必须修复其中一个自定义字段的值,结果发现它的值是 int,而不是字符串。但这些都是小事。我还想指出,元素名称中的引号不会以任何方式影响代码的成功。而且,不幸的是,您将用户名/密码转换为 Base64 的代码返回了 Jira 服务器不接受的结果。也许这是因为我的密码中的特殊字符。最后,我使用了 Postman 为我生成的 Base64 代码。
  • 很高兴听到它成功了。仅当单词包含空格时才需要对表中的元素使用双引号,但由于所有 Jira 字段的名称都是单个单词,这就是您可以省略它们的原因。如果你设置的值是一个数字,或者一个单词,你也可以省略它们,比如:summary = Test,或者id = 10705,但是你必须在有空格的时候使用它们,比如:summary =“带空格的单词”等。您说得对,将它们留在那里作为 Jira 字段名称是无害的。
  • 为了后人,我找到了正确将登录密码转换为Base64的方法。我直接将数据写入 $pair 变量,而不是使用 $username 和 $password。因此,我没有丢失密码中的特殊字符,并收到了正确的 Base64 代码。您的代码也是正确的,但它完全丢失了我使用的特殊字符。再次感谢您的帮助 :-) $pair = 'YourLogin:YourPass' $Bytes = [System.Text.Encoding]::ASCII.GetBytes($pair) $EncodedText =[Convert]::ToBase64String($Bytes) $headers = @{ 授权 = "基本 $EncodedText"} $headers
  • 您能否告知“特殊字符”是什么,以便我可以测试我的代码以查看为什么它不起作用?它可能是 PowerShell 转义符号或其他东西。您说的是“密码”,所以我假设您使用的是 Jira Server,而不是 Cloud,后者现在必须使用令牌,并且这些令牌是字母数字字符串。
  • 是的,你是对的,我们正在使用 Jira Server。我的密码由字符 ` 组成,不知何故在这段代码中丢失了。 $username = "Username" $password = "Abc1234``1" #实际上只有一个字符,但我不能为你写一个答案而不破坏格式# $pair = "${username}:${password}"在这种情况下,变量 $pair 将等于 "UserName: Abc12341" 我没有马上注意到它,所以我认为整个代码是错误的。但是如果你直接在 $pair 中输入你的用户名和密码,那么一切都是正确的就像这个 $pair = "UserName: Abc1234`1"
猜你喜欢
  • 2017-03-05
  • 2012-10-20
  • 2020-06-02
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
相关资源
最近更新 更多