¿Cómo hacer una solicitud de publicación HTTP con un cuerpo específico? ¿Y cómo acceder al token desde el servidor para permitirme iniciar sesión?

Estoy teniendo un escenario como:

1) Quiero crear una solicitud Http POST y para esto tengo los datos, vea esta imagen:

2) Como puede ver en la imagen de arriba, tengo que crear publicar una solicitud con el cuerpo mencionado y también recibo una respuesta llamada: token. ¿Cómo crear una solicitud de publicación y obtener esta respuesta de token?

3) Esa respuesta de token me permitirá iniciar sesión en myapp.

Soy novato en este escenario. He probado algunos códigos por mi cuenta, pero sigo confundiéndome sobre cómo combinar el código de delegado de mi aplicación con este código de solicitud POST.

Código

 @IBAction func signinaction(_ sender: Any) {

    self.username.resignFirstResponder()
    self.password.resignFirstResponder()

    if (self.username.text == "" || self.password.text == "") {
        let alertView = UIAlertController(title: "Login failed",
                                          message: "Wrong username or password." as String, preferredStyle:.alert)
        let okAction = UIAlertAction(title: "Try Again!", style: .default, handler: nil)
        alertView.addAction(okAction)
        self.present(alertView, animated: true, completion: nil)
        return
    }

    // Check if the user entered an email
    if let actualUsername = self.username.text {

        // Check if the user entered a password
        if let actualPassword = self.password.text {

            // Build the body message to request the token to the web app
            self.bodyStr = "username=8870417698&password=1234&grant_type=password" + actualUsername + "&password=" + actualPassword

            // Setup the request
            let myURL = NSURL(string: "http://ezschoolportalapi.azurewebsites.net/token")!
            let request = NSMutableURLRequest(url: myURL as URL)
            request.httpMethod = "POST"
            request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
            request.setValue("application/json", forHTTPHeaderField: "Accept")
            request.httpBody = bodyStr.data(using: String.Encoding.utf8)!

            let task = URLSession.shared.dataTask(with: request as URLRequest) {
                (data, response, error) -> Void in
                if  data?.count != 0
 {

                    do {

                                                   let tokenDictionary:NSDictionary = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! NSDictionary
                        print(tokenDictionary)
                        // Get the token
                        let token:String = tokenDictionary["access_token"] as! String

                        // Keep record of the token

                        let userdefaults = UserDefaults()

                        let saveToken = userdefaults.set(token, forKey: "access_token")
                        userdefaults.synchronize()


                        // Dismiss login view and go to the home view controller
                        DispatchQueue.main.async {
                            self.dismiss(animated: true, completion: nil)
                        }


                    }
                    catch {
                        // Wrong credentials
                        // Reset the text fields
                        self.username.text = ""
                        self.password.text = ""

                        // Setup the alert
                        let alertView = UIAlertController(title: "Login failed",
                                                          message: "Wrong username or password." as String, preferredStyle:.alert)
                        let okAction = UIAlertAction(title: "Try Again!", style:.default, handler: nil)
                        alertView.addAction(okAction)
                        self.present(alertView, animated: true, completion: nil)
                        return
                    }
                }
            }
            task.resume()
        }
    }
}

La pregunta es cómo combinar este código con mi código anterior:

let appDelegate = UIApplication.shared.delegate as! AppDelegate  appDelegate.gotoMainvc()

si uso directamente este código, en cualquiera de los casos puedo cambiar a mi pantalla de inicio, no importa si estoy usando este código de solicitud POST o no. Por favor ayuda.

Respuestas a la pregunta(1)

Su respuesta a la pregunta