API Jira REST - o comando CURL é bem-sucedido, o programa rápido falha

Sep 18 2020

Estou tentando usar a API REST Jira para atualizar problemas programaticamente por meio de um programa MacOS, escrito em Swift. Eu tenho um token de API Jira e consegui usar o CURL. Aqui está o comando:

curl --request PUT \
  --url 'https://xxxx.atlassian.net/rest/api/2/issue/SAN-2' \
  --user '[email protected]:zzz' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{
"update": {
"timetracking": [
{
"edit": {
"originalEstimate": "1w 1d"
}
}
]
}
}'

Onde zzz é o token de API. Isso funciona e o campo é atualizado corretamente.

A versão Swift reflete isso da melhor maneira que posso, mas falha com o erro

Resposta: {"errorMessages": ["O problema não existe ou você não tem permissão para vê-lo."], "Erros": {}}

Aqui está o código Swift:

        let tokenString = "[email protected]: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()

Obviamente, tenho permissão para editar o problema e ele existe. Eu tenho um token de API e funciona. o que estou perdendo?

Respostas

3 valosip Sep 18 2020 at 04:40

Eu vejo dois problemas:

1) Você está definindo encodedTokenString como Dados em vez de uma string.

guard let encodedTokenString = tokenString.data(using: .utf8)?.base64EncodedData() else { fatalError("Can't encode token") }

mude o acima para:

guard let encodedTokenString = tokenString.data(using: .utf8)?.base64EncodedString() else { fatalError("Can't encode token") }

2) Seu authString deve ser:

`let authString = String("Basic \(encodedTokenString)")`