因为我是Swift编程语言的新手。我正在构建mac应用程序。我必须通过将httprequest发送到我的api来与我的api集成。
我正在使用子模块SwiftHTTP作为http请求。
这是我的代码:
import Cocoa
import SwiftHTTPOSX
class ViewController: NSViewController {
@IBOutlet weak var EmailField: NSTextField!
@IBOutlet weak var PasswordField: NSSecureTextField!
@IBAction func signin(sender: AnyObject) {
println("email is \(EmailField.objectValue) and Password is \(PasswordField.objectValue)")
var request = HTTPTask()
request.GET("https:user@gmail.com:password@api.domain.co/api/v3/auth/token/", parameters: nil, success: {(response: HTTPResponse) in
if let data = response.responseObject as? NSData {
let str = NSString(data: data, encoding: NSUTF8StringEncoding)
println("response: \(response.responseObject)")
}
}, failure: {(error: NSError, response: HTTPResponse?) in
println("error: \(error)")
})
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override var representedObject: AnyObject? {
didSet {
// Update the view, if already loaded.
}
}
}
错误:
error: Error Domain=HTTPTask Code=401 "accessed denied" UserInfo=0x60000002ae20 {NSLocalizedDescription=accessed denied}
预期输出描述:
当我向" http:user@gmail.com:password@api.domain.co/api/v3/auth/token"发送请求时,在回复中我将获得apikey。但是上面的错误让我感到害怕。
答案 0 :(得分:1)
我不相信Apple的网络类允许您使用URL基本身份验证的URL格式,URL中包含用户名和密码。你有没有发现在任何地方记录?
即使他们这样做,你可能需要对用户名和密码进行url编码,这样你用户名中的“@”符号就不会绊倒。我实际上希望您提供的示例网址实际上尝试连接到“gmail.com”而不是“api.domain.co”。
就个人而言,对于HTTP基本身份验证,我改为构建一个标准的base64编码的Authorization标头来发送,而不是将其放在URL中。这里有一些我的代码片段给你举个例子。请注意,我在NSURLSessionConfiguration对象上设置了Authorization标头,因此使用该配置发出的所有请求都会自动添加标头。或者,您可以在每个请求上使用addValue:forHTTPHeaderField
添加标题。
private class func authorizationHeaderForEmailAddress(emailAddress: String, password: String) -> String? {
let userColonPass = "\(emailAddress):\(password)".dataUsingEncoding(NSUTF8StringEncoding)
if let base64UserColonPass = userColonPass?.base64EncodedStringWithOptions(nil) {
return "Basic \(base64UserColonPass)"
}
return nil
}
...
if let authHeader = SnapFeederAPI.authorizationHeaderForEmailAddress(emailAddress, password: password) {
// Add this to the NSURLSessionConfiguration so it's sent automatically with
// every request.
config.HTTPAdditionalHeaders = ["Authorization": authHeader]
} // Else there's a problem
答案 1 :(得分:1)
根本不需要使用SwiftHTTP。而且您使用的格式user@email.com:password@api.domain/com/....
在您使用Javascript或Jquery时也可以使用。
在Swift中,它不需要基本身份验证。对于基本身份验证,我们必须使用编码字符串发送到身份验证URL,如:
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let userPasswordString = "\(Email.stringValue):\(Password.stringValue)"
let userPasswordData = userPasswordString.dataUsingEncoding(NSUTF8StringEncoding)
let base64EncodedCredential = userPasswordData!.base64EncodedStringWithOptions(nil)
let authString = "Basic \(base64EncodedCredential)"
println("\(authString)")
config.HTTPAdditionalHeaders = ["Authorization" : authString]
let session = NSURLSession(configuration: config)
let url = NSURL(string: "https://api.domain.com/api/v2/auth/token/")
let task = session.dataTaskWithURL(url!) {
(let data, let response, let error) in
if let httpResponse = response as? NSHTTPURLResponse {
let dataString = NSString(data: data, encoding: NSUTF8StringEncoding)
}
}
之后只需打印数据,看它肯定会遇到你的问题。