¿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.