Jira REST API-CURL命令成功,快速程序失败

问题描述

我正在尝试使用Jira REST API通过以Swift编写的MacOS程序以编程方式更新问题。我有一个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”:[“问题不存在或您无权查看。”,“错误”:{}}

这是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)您正在将encodeTokenStringString设置为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)")`

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...