J'ai un service RESTFull avec authentification de base et je souhaite l'invoquer depuis iOS + swift. Comment et où dois-je fournir des informations d'identification pour cette demande?
Mon code (désolé, je viens de commencer à apprendre iOS / obj-c / swift):
class APIProxy: NSObject {
var data: NSMutableData = NSMutableData()
func connectToWebApi() {
var urlPath = "http://xx.xx.xx.xx/BP3_0_32/ru/hs/testservis/somemethod"
NSLog("connection string \(urlPath)")
var url: NSURL = NSURL(string: urlPath)
var request = NSMutableURLRequest(URL: url)
let username = "hs"
let password = "1"
let loginString = NSString(format: "%@:%@", username, password)
let loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)
let base64LoginString = loginData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.fromMask(0))
request.setValue(base64LoginString, forHTTPHeaderField: "Authorization")
var connection: NSURLConnection = NSURLConnection(request: request, delegate: self)
connection.start()
}
//NSURLConnection delegate method
func connection(connection: NSURLConnection!, didFailWithError error: NSError!) {
println("Failed with error:\(error.localizedDescription)")
}
//NSURLConnection delegate method
func connection(didReceiveResponse: NSURLConnection!, didReceiveResponse response: NSURLResponse!) {
//New request so we need to clear the data object
self.data = NSMutableData()
}
//NSURLConnection delegate method
func connection(connection: NSURLConnection!, didReceiveData data: NSData!) {
//Append incoming data
self.data.appendData(data)
}
//NSURLConnection delegate method
func connectionDidFinishLoading(connection: NSURLConnection!) {
NSLog("connectionDidFinishLoading");
}
}
NSURLConnection(request: request, delegate: self)
serastart
la connexion pour vous. N'appelez pas lastart
méthode explicitement vous-même, en la démarrant effectivement une deuxième fois.Réponses:
Vous fournissez des informations d'identification dans une
URLRequest
instance, comme ceci dans Swift 3:Ou dans un
NSMutableURLRequest
Swift 2:la source
NSDataBase64EncodingOptions(0)
ounil
pour aucune option. Mise à jour de la réponse.// créer la chaîne de codage d'authentification base 64
// créer une URL d'authentification
// créer et initialiser la demande d'authentification de base
// Vous pouvez utiliser l'une des méthodes ci-dessous
// 1 requête URL avec NSURLConnectionDataDelegate
// 2 Requête URL avec AsynchronousRequest
// 2 Requête URL avec AsynchronousRequest avec sortie json
// 3 Requête URL avec SynchronousRequest
// 4 Requête URL avec NSURLSession
// vous pouvez obtenir une erreur fatale si vous avez modifié la requête.HTTPMethod = "POST" lorsque le serveur demande la requête GET
la source
NSURLConnection(request: request, delegate: self)
lance la requête. Vous ne devriez pas lestart
faire une seconde fois.rapide 4:
la source
Dans Swift 2:
la source
optez pour SWIFT 3 et APACHE simple Auth:
la source
J'ai eu un problème similaire en essayant de POSTER sur MailGun pour certains e-mails automatisés que j'implémentais dans une application.
J'ai pu faire fonctionner cela correctement avec une grande réponse HTTP. J'ai mis le chemin complet dans Keys.plist afin que je puisse télécharger mon code sur github et décomposer certains des arguments en variables afin que je puisse les avoir définis par programme plus tard.
Le chemin Mailgun est dans Keys.plist sous la forme d'une chaîne appelée mailgunAPIPath avec la valeur:
J'espère que cela aidera à offrir une solution à quelqu'un qui essaie d'éviter d'utiliser du code tiers pour ses demandes POST!
la source
ma solution fonctionne comme suit:
Vous pouvez utiliser cette classe comme implémentation d'un ViewController. Connectez vos champs aux variables annotées IBOutlet et votre Button à la fonction annotée IBAction.
Explication: Dans la connexion de fonction, vous créez votre demande avec NSURL, NSURLRequest et NSURLConnection. Essentiel ici est le délégué qui fait référence à cette classe (self). Pour recevoir les appels des délégués, vous devez
la source
J'appelle le json en cliquant sur le bouton de connexion
Ici, j'ai fait un dictionnaire séparé pour les paramètres.
la source