错误:错误域= HTTPTask代码= 404“找不到页面”UserInfo = 0x608000228720 {NSLocalizedDescription = page not found}

时间:2014-12-17 08:30:59

标签: json macos swift

因为我是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。但是上面的错误让我感到害怕。

2 个答案:

答案 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)
}
}

之后只需打印数据,看它肯定会遇到你的问题。