Eu tenho um serviço RESTFull com autenticação básica e quero invocá-lo do iOS + swift. Como e onde devo fornecer credencial para esta solicitação?
Meu código (desculpe, acabei de começar 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
a conexão para você. Não chame ostart
método explicitamente você mesmo, iniciando-o efetivamente uma segunda vez.Respostas:
Você fornece credenciais em uma
URLRequest
instância, como esta no Swift 3:Ou em um
NSMutableURLRequest
no Swift 2:fonte
NSDataBase64EncodingOptions(0)
ounil
sem opções. Atualizou a resposta.// cria string de codificação de base 64 de autenticação
// criar url de autenticação
// cria e inicializa a solicitação de autenticação básica
// Você pode usar um dos métodos abaixo
// 1 solicitação de URL com NSURLConnectionDataDelegate
// 2 Solicitação de URL com AsynchronousRequest
// 2 Solicitação de URL com AsynchronousRequest com saída json
// 3 Solicitação de URL com SynchronousRequest
// 4 Solicitação de URL com NSURLSession
// você pode obter um erro fatal se alterar o request.HTTPMethod = "POST" quando o servidor solicitar o pedido GET
fonte
NSURLConnection(request: request, delegate: self)
inicia a solicitação. Você não deveria fazerstart
isso uma segunda vez.4 rápido:
fonte
Em Swift 2:
fonte
vá direto para SWIFT 3 e APACHE simples Auth:
fonte
Tive um problema semelhante ao tentar POSTAR no MailGun para alguns e-mails automatizados que estava implementando em um aplicativo.
Consegui fazer com que isso funcionasse corretamente com uma grande resposta HTTP. Eu coloquei o caminho completo em Keys.plist para que eu pudesse carregar meu código no github e dividi alguns dos argumentos em variáveis para que eu pudesse defini-los programaticamente mais tarde.
O caminho do Mailgun está em Keys.plist como uma string chamada mailgunAPIPath com o valor:
Espero que isso ajude a oferecer uma solução para alguém que está tentando evitar o uso de código de terceiros para suas solicitações POST!
fonte
minha solução funciona da seguinte maneira:
Você pode usar essa classe como a implementação de um ViewController. Conecte seus campos aos vars anotados IBOutlet e seu Botão à função anotada IBAction.
Explicação: No login de função, você cria sua solicitação com NSURL, NSURLRequest e NSURLConnection. O essencial aqui é o delegado que faz referência a essa classe (self). Para receber as chamadas dos delegados, você precisa
fonte
Estou ligando para o json ao clicar no botão de login
Aqui, fiz um dicionário separado para os parâmetros.
fonte