我正在尝试调用使用HTTP Basic Auth的本地Rest服务。
作为我请求的结果,我得到了以下内容:
找到:错误-未经授权
找到:原因-需要密码
下面是我的函数,它执行请求。
func connect(url: String) -> Bool {
let url: NSURL = NSURL(string: url);
let login:String = "admin";
let password:String = "test123";
var defaultCredentials: NSURLCredential = NSURLCredential(user: login, password: password, persistence: NSURLCredentialPersistence.ForSession);
let host: String = url.host;
let port: Int = url.port;
let prot: String = url.scheme;
println("set following vars \(host) + \(port) + \(prot)");
var protectionSpace: NSURLProtectionSpace = NSURLProtectionSpace(host: host,port: port,`protocol`: prot,realm: nil,authenticationMethod: NSURLAuthenticationMethodHTTPBasic);
var credentialStorage: NSURLCredentialStorage = NSURLCredentialStorage.sharedCredentialStorage();
credentialStorage.setCredential(defaultCredentials, forProtectionSpace: protectionSpace);
var sessionConfiguration: NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration();
sessionConfiguration.URLCredentialStorage = credentialStorage;
let session: NSURLSession = NSURLSession(configuration: sessionConfiguration); //NSURLSession.sharedSession()
//NSURLSession.sessionWithConfiguration(sessionConfiguration);
let task = session.dataTaskWithURL(url, completionHandler: {data, response, error -> Void in
println("Task completed")
if((error) != nil) {
// If there is an error in the web request, print it to the console
println(error.localizedDescription)
}
var err: NSError?
var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary
if(err != nil) {
// If there is an error parsing JSON, print it to the console
println("JSON Error \(err!.localizedDescription)")
}
self.delegate.didReceiveAPIResults(jsonResult);
})
task.resume()
return true
}有谁能给我个提示吗?
发布于 2014-08-19 04:46:55
我会考虑使用AFNetworking。我尝试使用AlamoFire,但遇到了基本身份验证(more info on that here)的问题。这是我过去在Swift中执行基本身份验证的方式。
static let sharedInstance = NetworkManager(url: NSURL(string: baseUrl))
...
sharedInstance.requestSerializer.clearAuthorizationHeader()
sharedInstance.requestSerializer.setAuthorizationHeaderFieldWithUsername(email, password:password)
sharedInstance.POST(loginAPI,
parameters: nil,
success: success,
failure: failure)请注意,success和failure是我传递到我的方法中的闭包(就像来自Objective C的块一样)。
如果您还没有将Objective C库导入到Swift中,我建议您像往常一样使用cocoapods。然后,只需将此行添加到Bridging-Header.h文件中。
#import <AFNetworking/AFNetworking.h>发布于 2014-10-16 04:47:59
这是最基本的方法(从这里开始:https://stackoverflow.com/a/24380884),但它是有效的:
// 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(NSDataBase64EncodingOptions.fromMask(0))
// create the request
let url = NSURL(string: "http://www.example.com/")
let request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"
request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")
// fire off the request
// make sure your class conforms to NSURLConnectionDelegate
let urlConnection = NSURLConnection(request: request, delegate: self)如果您收到身份验证质询,下面将介绍一种更好的方法:
发布于 2016-04-23 21:50:53
SWIFT 2.0 +
let username = "USER_NAME"
let password = "PASSWORD"
let credentialData = "\(username):\(password)".dataUsingEncoding(NSUTF8StringEncoding)!
let base64Credentials = credentialData.base64EncodedStringWithOptions([])
let headers = ["Authorization": "Basic \(base64Credentials)"]
// let manager = Alamofire.Manager.sharedInstance
Alamofire.Manager.sharedInstance.session.configuration.timeoutIntervalForRequest = 300
Alamofire.Manager.sharedInstance.upload(.POST,url,headers : headers,multipartFormData: { multipartFormData in
NSLog("url----- %@ \n perameter --- %@",url, dicsParams)
for (key, value) in dicsParams {
},
encodingCompletion: { encodingResult in
switch encodingResult {
case .Success(let upload, _, _):
upload.responseJSON { response in
debugPrint(response)
AppHelper.hideLoadingSpinner()
if response.result.value is NSNull
{
}
else
{
if let JSON = response.result.value {
var mydict = NSMutableDictionary()
mydict = JSON as! NSMutableDictionary
if (self.delegate != nil){
print("response:--------------------\n %@",mydict)
}
}
else
{
print("response not converted to JSON")
}
}
}
case .Failure(let encodingError):
print(encodingError)
if (self.delegate != nil){
self.delegate.HttpWrapperfetchDataFail!(self, error: encodingError as NSError);
}
}
}
)https://stackoverflow.com/questions/25371404
复制相似问题