Tengo un servicio RESTFull con autenticación básica y quiero invocarlo desde iOS + swift. ¿Cómo y dónde debo proporcionar la credencial para esta solicitud?
Mi código (lo siento, acabo de empezar a aprender 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)
serástart
para ti. No llame alstart
método explícitamente usted mismo, iniciándolo efectivamente por segunda vez.Respuestas:
Proporciona credenciales en una
URLRequest
instancia, como esta en Swift 3:O en
NSMutableURLRequest
Swift 2:fuente
NSDataBase64EncodingOptions(0)
onil
sin opciones. Actualizó la respuesta.// crear cadena de codificación base 64 de autenticación
// crear URL de autenticación
// crear e inicializar la solicitud de autenticación básica
// Puede utilizar uno de los métodos siguientes
// 1 solicitud de URL con NSURLConnectionDataDelegate
// 2 Solicitud de URL con AsynchronousRequest
// 2 Solicitud de URL con AsynchronousRequest con salida json
// 3 Solicitud de URL con SynchronousRequest
// 4 Solicitud de URL con NSURLSession
// Es posible que obtenga un error fatal si cambia la solicitud. HTTPMethod = "POST" cuando el servidor solicita la solicitud GET
fuente
NSURLConnection(request: request, delegate: self)
inicia la solicitud. No deberías hacerlostart
por segunda vez.rápido 4:
fuente
En Swift 2:
fuente
ir sencillo para SWIFT 3 y APACHE simple Auth:
fuente
Tuve un problema similar al intentar POSTAR en MailGun para algunos correos electrónicos automatizados que estaba implementando en una aplicación.
Pude hacer que esto funcionara correctamente con una gran respuesta HTTP. Puse la ruta completa en Keys.plist para poder cargar mi código en github y dividir algunos de los argumentos en variables para poder configurarlos programáticamente más adelante.
La ruta Mailgun está en Keys.plist como una cadena llamada mailgunAPIPath con el valor:
¡Espero que esto ayude a ofrecer una solución a alguien que intenta evitar usar código de terceros para sus solicitudes POST!
fuente
mi solución funciona de la siguiente manera:
Puede utilizar esta clase como implementación de un ViewController. Conecte sus campos a las variables anotadas IBOutlet y su Botón a la función anotada IBAction.
Explicación: En la función de inicio de sesión, crea su solicitud con NSURL, NSURLRequest y NSURLConnection. Es esencial aquí el delegado que hace referencia a esta clase (yo). Para recibir las llamadas de los delegados necesita
fuente
Estoy llamando al json al hacer clic en el botón de inicio de sesión
Aquí, he creado un diccionario separado para los parámetros.
fuente