【问题标题】:Coudn't load JSON while calling api in Swift在 Swift 中调用 api 时无法加载 JSON
【发布时间】:2014-12-16 10:09:16
【问题描述】:

我有自己的应用程序 api。我试图调用 api,我需要获取 json 数据作为响应。这是我的代码

import Cocoa

class ViewController: NSViewController {

@IBOutlet weak var EmailText: NSTextField!

@IBOutlet weak var PasswordText: NSSecureTextField!
@IBAction func signin(sender: AnyObject) {
    println("email is \(EmailText.objectValue) and Password is \(PasswordText.objectValue)")

    var url : String = "https:username:password@api.example.co/api/v3/auth/token/"
    var request : NSMutableURLRequest = NSMutableURLRequest()
    request.URL = NSURL(string: url)
    request.HTTPMethod = "GET"

    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:{ (response:NSURLResponse!, data: NSData!, error: NSError!) -> Void in
        var error: AutoreleasingUnsafeMutablePointer<NSError?> = nil
        let jsonResult: NSDictionary! = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers, error: error) as? NSDictionary

        if (jsonResult != nil) {
            println("\(jsonResult)")
        } else {
            println("Couldn't load json")
        }


    })
}
override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

override var representedObject: AnyObject? {
    didSet {
    // Update the view, if already loaded.
    }
}
}

jsonResult 应该给我 apikey 作为 json 数据。

但是在运行 mac 应用程序时,我看到了 else 条件。由于我对 swift 和构建 mac 应用程序非常陌生,因此我无法克服这一点。

【问题讨论】:

  • 别忘了设置 JSON 标头之类的?你有错误吗?你有什么回应吗?我建议你向 AfNetworking 创建的 Alamofire github.com/Alamofire/Alamofire 提出请求。
  • 感谢@houguetpierre 的链接。我已经给出了 json 标头,但我得到的响应为零。有没有这样的相关链接?请帮忙
  • 您是否尝试在浏览器中播放请求或使用高级休息客户端 Chrome 插件?是否可以看到等待的 JSON?可能不是字典,数据转换器返回 nil。
  • 那么报什么错误??
  • 检查错误并打印数据 - 打赌它是一个 html 页面

标签: json macos swift


【解决方案1】:

我认为这是error: Error Domain=HTTPTask Code=404 "page not found" UserInfo=0x608000228720 {NSLocalizedDescription=page not found} 的副本。无论如何,正如我对那个问题所说的,请在下面查看。

您正在使用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)
}
}

然后只需打印数据,看看它肯定会满足您的问题。

【讨论】:

    【解决方案2】:

    正如@houguet pierre 提到的,你可以使用Alamofire,如果你得到一个 JSON 对象,它会处理,如果你没有,也会提醒你。 此代码是最简单的情况,可能足以满足您的需要。

    Alamofire.request(.GET, url) .responseJSON { (_, _, JSON, error) in if error == nil { println(JSON) } else { println(error.localizedDescription) }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      • 2014-05-22
      相关资源
      最近更新 更多