Created
April 30, 2015 12:50
-
-
Save ViniciusMiana/955413e1adfd997c90c3 to your computer and use it in GitHub Desktop.
JSON Service With Basic Authentication
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// JSONService.swift | |
// SwiftPlaces | |
// | |
// Created by Joshua Smith on 7/25/14. | |
// Copyright (c) 2014 iJoshSmith. All rights reserved. | |
// | |
import Foundation | |
/** A simple HTTP client for fetching JSON data. */ | |
class JSONService | |
{ | |
/** Prepares a GET request for the specified URL. */ | |
class func GET(url: NSURL, user: String, password: String) -> SuccessHandler | |
{ | |
let service = JSONService("GET", url, user, password) | |
service.successHandler = SuccessHandler(service: service) | |
return service.successHandler! | |
} | |
private init(_ name: String, _ url: NSURL, _ user: String, _ password: String) | |
{ | |
self.name = name | |
self.url = url | |
self.usuario = user | |
self.senha = password | |
} | |
class SuccessHandler | |
{ | |
func success( | |
closure: (json: AnyObject) -> (), // Array or dictionary | |
queue: NSOperationQueue? ) // Background queue by default | |
-> ErrorHandler | |
{ | |
self.closure = closure | |
self.queue = queue | |
service.errorHandler = ErrorHandler(service: service) | |
return service.errorHandler! | |
} | |
private init(service: JSONService) | |
{ | |
self.service = service | |
closure = { (_) in return } | |
} | |
private var | |
closure: (json: AnyObject) -> (), | |
queue: NSOperationQueue?, | |
service: JSONService | |
} | |
class ErrorHandler | |
{ | |
func failure( | |
closure: (statusCode: Int, error: NSError?) -> (), | |
queue: NSOperationQueue? ) // Background queue by default | |
{ | |
self.closure = closure | |
self.queue = queue | |
service.execute() | |
} | |
private init(service: JSONService) | |
{ | |
self.service = service | |
closure = { (_,_) in return } | |
} | |
private var | |
closure: (statusCode: Int, error: NSError?) -> (), | |
queue: NSOperationQueue?, | |
service: JSONService | |
} | |
private func execute() | |
{ | |
let request = NSMutableURLRequest(URL: url) | |
request.HTTPMethod = name | |
let loginString = NSString(format: "%@:%@", usuario, senha) | |
let loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)! | |
let base64LoginString = loginData.base64EncodedDataWithOptions(nil) | |
request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization") | |
NSURLSession.sharedSession().dataTaskWithRequest(request) | |
{ | |
[weak self] | |
data, response, error in | |
// Reference self strongly via `this` | |
if let this = self | |
{ | |
var statusCode = 0 | |
if let httpResponse = response as? NSHTTPURLResponse | |
{ | |
statusCode = httpResponse.statusCode | |
} | |
var json: AnyObject?, jsonError: NSError? | |
switch JSONObjectWithData(data) | |
{ | |
case .Success(let res): json = res | |
case .Failure(let err): jsonError = err | |
} | |
this.handleResult(json, error ?? jsonError, statusCode) | |
} | |
}.resume() | |
} | |
private func handleResult(json: AnyObject?, _ error: NSError?, _ statusCode: Int) | |
{ | |
if json != nil | |
{ | |
let handler = successHandler! | |
let success = { handler.closure(json: json!) } | |
if let queue = handler.queue { queue.addOperationWithBlock(success) } | |
else { success() } | |
} | |
else | |
{ | |
let handler = errorHandler! | |
let failure = { handler.closure(statusCode: statusCode, error: error) } | |
if let queue = handler.queue { queue.addOperationWithBlock(failure) } | |
else { failure() } | |
} | |
// Break the retain cycles keeping this object graph alive. | |
errorHandler = nil | |
successHandler = nil | |
} | |
private var | |
errorHandler: ErrorHandler?, | |
successHandler: SuccessHandler? | |
private let | |
name: String, | |
url: NSURL, | |
usuario: String, | |
senha: String | |
} |
gabrielpreto
commented
Apr 30, 2015
Para autenticação síncrona eu montei esse aqui, funcionou bem comigo:
func getData (url: String) -> NSData? {
// set up the base64-encoded credentials
let username = "user"
let password = "pass"
let loginString = NSString(format: "%@:%@", username, password)
let loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)!
let base64LoginString = loginData.base64EncodedStringWithOptions(nil)
// create the request
let url2 = NSURL(string: url)
let request = NSMutableURLRequest(URL: url2!)
request.HTTPMethod = "GET"
request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")
var response: NSURLResponse?; var error: NSError?
let data: NSData? = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: &error)
return data
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment