Jira REST API - CURL 命令成功,swift 程序失败
Jira REST API - CURL command succeeds, swift program fails
我正在尝试使用 Jira REST API 通过 MacOS 程序以编程方式更新问题,该程序是用 Swift 编写的。我有一个 Jira API 令牌并成功使用了 CURL。这是命令:
curl --request PUT \
--url 'https://xxxx.atlassian.net/rest/api/2/issue/SAN-2' \
--user 'xxx@yyy.com:zzz' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{
"update": {
"timetracking": [
{
"edit": {
"originalEstimate": "1w 1d"
}
}
]
}
}'
其中 zzz 是 API 令牌。这行得通并且该字段已正确更新。
Swift 版本尽可能地反映了这一点,但失败并显示错误
响应:{"errorMessages":["问题不存在或您无权查看它。"],"errors":{}}
这里是 Swift 代码:
let tokenString = "xxx@yyy.com:zzz"
guard let encodedTokenString = tokenString.data(using: .utf8)?.base64EncodedData() else { fatalError("Can't encode token") }
let authString = String("Token token=\(encodedTokenString)")
guard let url = URL(string: "https://xxxx.atlassian.net/rest/api/2/issue/SAN-2")
else {
fatalError("Couldn't create a static URL")
}
let request = NSMutableURLRequest(url: url)
request.addValue(authString, forHTTPHeaderField: "Authorization")
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpMethod = "PUT"
let dataString = "{\"update\": {\"timetracking\": [{\"edit\": {\"originalEstimate\": \"1w 1d\"}}]}}".utf8
let body = Data(dataString)
request.httpBody = body
let session = URLSession.shared
session.dataTask(with: request as URLRequest) { (data, response, error) -> Void in
guard let data = data, let responseString = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as String?, !responseString.isEmpty else {
print("No valid response!")
return
}
print("Response: " + responseString)
}.resume()
我显然有权编辑该问题并且它存在。我有一个 API 令牌,它可以工作。我错过了什么?
我看到两个问题:
1) 您将 encodedTokenString 设置为 Data 而不是字符串。
guard let encodedTokenString = tokenString.data(using: .utf8)?.base64EncodedData() else { fatalError("Can't encode token") }
将以上内容改为:
guard let encodedTokenString = tokenString.data(using: .utf8)?.base64EncodedString() else { fatalError("Can't encode token") }
2) 您的 authString 应该是:
`let authString = String("Basic \(encodedTokenString)")`
我正在尝试使用 Jira REST API 通过 MacOS 程序以编程方式更新问题,该程序是用 Swift 编写的。我有一个 Jira API 令牌并成功使用了 CURL。这是命令:
curl --request PUT \
--url 'https://xxxx.atlassian.net/rest/api/2/issue/SAN-2' \
--user 'xxx@yyy.com:zzz' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{
"update": {
"timetracking": [
{
"edit": {
"originalEstimate": "1w 1d"
}
}
]
}
}'
其中 zzz 是 API 令牌。这行得通并且该字段已正确更新。
Swift 版本尽可能地反映了这一点,但失败并显示错误
响应:{"errorMessages":["问题不存在或您无权查看它。"],"errors":{}}
这里是 Swift 代码:
let tokenString = "xxx@yyy.com:zzz"
guard let encodedTokenString = tokenString.data(using: .utf8)?.base64EncodedData() else { fatalError("Can't encode token") }
let authString = String("Token token=\(encodedTokenString)")
guard let url = URL(string: "https://xxxx.atlassian.net/rest/api/2/issue/SAN-2")
else {
fatalError("Couldn't create a static URL")
}
let request = NSMutableURLRequest(url: url)
request.addValue(authString, forHTTPHeaderField: "Authorization")
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpMethod = "PUT"
let dataString = "{\"update\": {\"timetracking\": [{\"edit\": {\"originalEstimate\": \"1w 1d\"}}]}}".utf8
let body = Data(dataString)
request.httpBody = body
let session = URLSession.shared
session.dataTask(with: request as URLRequest) { (data, response, error) -> Void in
guard let data = data, let responseString = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as String?, !responseString.isEmpty else {
print("No valid response!")
return
}
print("Response: " + responseString)
}.resume()
我显然有权编辑该问题并且它存在。我有一个 API 令牌,它可以工作。我错过了什么?
我看到两个问题:
1) 您将 encodedTokenString 设置为 Data 而不是字符串。
guard let encodedTokenString = tokenString.data(using: .utf8)?.base64EncodedData() else { fatalError("Can't encode token") }
将以上内容改为:
guard let encodedTokenString = tokenString.data(using: .utf8)?.base64EncodedString() else { fatalError("Can't encode token") }
2) 您的 authString 应该是:
`let authString = String("Basic \(encodedTokenString)")`