API Jira REST - La commande CURL réussit, le programme Swift échoue

Sep 18 2020

J'essaie d'utiliser l'API Jira REST pour mettre à jour les problèmes par programme via un programme MacOS, écrit en Swift. J'ai un jeton d'API Jira et j'ai réussi à utiliser CURL. Voici la commande:

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"
}
}
]
}
}'

Où zzz est le jeton API. Cela fonctionne et le champ est mis à jour correctement.

La version Swift reflète cela d'aussi près que possible, mais échoue avec l'erreur

Réponse: {"errorMessages": ["Le problème n'existe pas ou vous n'êtes pas autorisé à le voir."], "Errors": {}}

Voici le code 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()

J'ai clairement l'autorisation de modifier le problème et il existe. J'ai un jeton API et cela fonctionne. Qu'est-ce que je rate?

Réponses

3 valosip Sep 18 2020 at 04:40

Je vois deux problèmes:

1) Vous définissez encodedTokenString sur Data au lieu d'une chaîne.

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

changez ce qui précède en:

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

2) Votre authString doit être:

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