【问题标题】:Posting Jira works on Python but not on PowerShell发布 Jira 适用于 Python,但不适用于 PowerShell
【发布时间】:2019-09-30 09:05:43
【问题描述】:

我正在尝试使用脚本向 Jira 发送一个 POST 请求,它在 Python 上运行良好,但在 PowerShell 上却不行。

我尝试 GET 请求以使用 PowerShell 从 Jira 获取一些数据并且它有效,所以我猜登录详细信息是正确的。所以我唯一关心的是有效载荷。也许我的 JSON 格式不正确。

Python(工作):

headers = {
  "Accept": "application/json;charset=utf-8",
  "Content-Type": "application/json"
}

payload = {
  "fields": {
    "project": {
      "key": "SDF"
    },
    "summary": "test",
    "description": "Creating of an issue using project keys and issue type names using the REST API",
    "issuetype": {
      "name": "Request"
    }
  }
}

password = open('passwords_jira2snow.txt').readlines()
jira_login = HTTPBasicAuth(password[0].rstrip('\n'), password[1].rstrip('\n')) 

r = requests.post(url="domain/rest/api/2/issue", data = json.dumps(payload), auth=jira_login, verify=False, headers=headers)
#jira_response = json.loads(r.text)
print(r.text)

PowerShell(不起作用):

$payload = ('{
  "fields": {
    "project": {
      "key": "SDF"
    },
    "summary": "test",
    "description": "Creating of an issue using project keys and issue type names using the REST API",
    "issuetype": {
      "name": "Request"
    }
  }
}')
$hdrs1 = @{}
$hdrs1.Add("login",$login)
$hdrs1.Add("password",$password)

$CreateJira = Invoke-RestMethod -Method POST -Headers $hdrs1 -Uri "domain/rest/api/2/issue" -Body $payload -ContentType "application/json"
Write-Host $CreateJira

我来了

错误:对 sessionauth 端点的 REST 调用失败,出现错误“ProtocolError - System.Net.WebException:远程服务器返回错误:(400)错误请求。 在 Microsoft.PowerShell.Commands.WebRequestPSCmdlet.GetResponse(WebRequest 请求) 在 Microsoft.PowerShell.Commands.WebRequestPSCmdlet.ProcessRecord()' 当前端点:'https://domain/sessionauth/v1/authenticate'

【问题讨论】:

  • 我相信第一个标题被称为username 而不是login
  • 凭证不是问题。 GET 请求就像我提到的那样工作
  • $payload 应该是哈希表,而不是 JSON 字符串。
  • @AnsgarWiechers 你介意举个例子吗?不太熟悉哈希表
  • 发帖了,谢谢大家

标签: json powershell jira jira-rest-api


【解决方案1】:

使用 cmdlet get-help Invoke-RestMethod -Examples 检查 PS 中的文档。有一个关于如何处理 POST 请求的示例。 不要在标头上设置您的凭据,而是创建一个 Credentials 对象并使用Invoke-RestMethod-Credentials 参数。

凭据的处理方式通常不同于 GET 请求和 REST 上的 POST 请求。

另一方面,我建议您改用此JiraPS Module,这样您就无需重新发明轮子并专注于完成工作!

【讨论】:

    【解决方案2】:

    不知道为什么,但以其他方式定义凭据有所帮助。这很奇怪,因为 GET 请求默认工作。

     $login = "test"
     $password = "test"  
     $pair = "$($login):$($password)"
     $encodedCreds = 
     [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair))  
     $hdrs1.Add("Authorization", "Basic $encodedCreds")  
    

    【讨论】:

      猜你喜欢
      • 2023-01-12
      • 2021-10-06
      • 1970-01-01
      • 2012-08-04
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 1970-01-01
      相关资源
      最近更新 更多