2017-04-07 3 views
1

Ich habe Probleme mit dem Erhalt von Passwortsalz von meinem VM-Server über Alamofire. Ich mache eine Anfrage an den Server und es sollte mir Salz zurückgeben, damit ich mein Passwort salzen, es hacken und es zurück zum Server senden kann.Speichern von Alamofire-Anfragedaten in eine Variable

Das Problem ist, dass ich verstehe nicht, wie das Salz zu sparen, dass Alamofire empfängt, in eine Variable, also kann ich es nur mit einem Passwort hinzufügen und Hash es wie folgt aus:

let salted_password = user_password + salt 
let hash = salted_password.sha1() 

Wo user_password ist was der Benutzer in Passwort-Feld eingegeben und salt ist, was ich von Alamofire Salz Anfrage erhalten habe.

ist hier mein Code:

func getSalt(completionHandler: @escaping (DataResponse<String>, Error?) -> Void) { 

     Alamofire.request("http://192.168.0.201/salt", method: .post, parameters: salt_parameters).responseString { response in 

     switch response.result { 
     case .success(let value): 
      completionHandler(response as DataResponse<String>, nil) 
     case .failure(let error): 
      completionHandler("Failure", error) 
      } 
     } 
    } 

    let salt = getSalt { response, responseError in 

     return response.result.value! 
    } 

Es mir folgende Fehler gibt:

Binary operator '+' cannot be applied to operands of type 'String' and '()'. 

So ist es möglich, einen Anforderungswert in eine Variable zu speichern? Was soll ich machen?

Vielen Dank für Ihre Aufmerksamkeit.

+3

Was ist der Rückgabewert von 'getSalt()'? Es scheint, dass Sie versuchen, eine "Zeichenfolge" mit dem Ergebnis dieser Funktion zu kombinieren, die Sie nicht können (wie Sie auf die harte Tour entdeckt haben :)) – pbodsk

+0

was Sie tun sollten, ist etwas wie das stattdessen. 'var salt: Schnur ?; getSalt {Antwort, responseError in salt = response.result.value; } ' –

+0

@ZonilyJame Vielen Dank, es funktioniert! –

Antwort

0

Das Problem hier ist, weil, wie Sie

Zum Beispiel Ihres completion block

implementiert:

func someAsynchronousCall(a: Int, b: Int, @escaping block: (_ result: Int) -> Void) { 
    ... some code here 
    ... { 
     // let's just say some async call was done and this code is called after the call was done 
     block(a + b) 
    } 
} 

diesen Code zu verwenden, es würde wie folgt aussehen:

var answer: Int = 0 
someAsynchronousCall(100, b: 200) { result in // the `result` is like what you're returning to the user since API calls need to be called asynchronously you do it like this rather than creating a function that has a default return type. 
    answer = result 
    print(answer) 
} 
print(answer) 

Der Druck würde so aussehen

0 
300 

Da wir Antwort als 0 erklärt gedruckt, dass zum ersten Mal seit dem Asynchron-Aufruf noch nicht fertig war, nachdem der Asynchron-Aufruf (in der Regel ein paar Millisekunden nach) durchgeführt wurde es dann 300 gedruckt

Also alles in allem Ihrer Code sollte in etwa so aussehen:

var salt: String? 
getSalt { response, responseError in 
    salt = response.result.value 
}