Swift Json - 从 API 获取数据

Posted

技术标签:

【中文标题】Swift Json - 从 API 获取数据【英文标题】:Swift Json - get data from API 【发布时间】:2015-03-24 12:39:18 【问题描述】:

我在尝试从 Web api 获取数据时遇到问题。但我得到的是零。 我无法从 api 获取文章列表。有什么建议吗?

api文档地址:yazar.io/doc/

我的 NSObject 文件:

import Alamofire
struct Yazarioservice 

    // Doc http://yazar.io/doc/        
    private static let baseURL = "http://yazar.io"
    private enum ResourcePath: Printable 

        case Articles
        case StoryUpvote(storyId: Int)
        var description: String 
            switch self 
            case .Articles: return "/api/article/feed/1"
            case .StoryUpvote(let id): return "/api/client/favorites/action/"
            
        
    

    static func articleForSection(section: String, page: Int, response: (JSON) -> ())

        let urlString = baseURL + ResourcePath.Articles.description
        println(urlString)
        let parameters = [
            "page": toString(page)
        ]
        println(parameters)

        Alamofire.request(.GET, baseURL, parameters: parameters).responseJSON(_, _, data, _) -> Void in
            let articles = JSON(data ?? [])
            response(articles)
        
    

我的表格视图控制器;

class articlesTableViewController: UITableViewController, MakaleTableViewCellDelegate 

    let transitionManager = TransitionManager()
    var articles: JSON! = []

    func loadarticles(section: String, page: Int)
        YazarIoService.articleForSection(section, page: page)  (JSON) -> () in
            self.articles = JSON["articles"]
            self.tableView.reloadData()
        
     

    override func viewDidLoad() 
        super.viewDidLoad()


        UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

        tableView.estimatedRowHeight = 100
        tableView.rowHeight = UITableViewAutomaticDimension

        loadarticles("", page: 1)
        println(articles[])
    

    @IBAction func MenuButtonDidTouch(sender: AnyObject) 
        performSegueWithIdentifier("MenuSegue", sender: self)
    


    @IBAction func LoginbutonDidTouch(sender: AnyObject) 
        performSegueWithIdentifier("LoginSegue", sender: self)
    

    //number of rows
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

        return articles.count //
    


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCellWithIdentifier("MakaleCell") as MakaleTableViewCell //--> cell'in özelliklerine erişmek içim bunu yazdık. Eskiden UITableViewCell'di. Değiştirmezsen cell.title... vs çalışmakz.

        let makale = articles[indexPath.row]
        cell.configureWithMakale(makale)

        cell.delegate = self

        return cell            
    


    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
        performSegueWithIdentifier("WebSegue", sender: indexPath) 

        tableView.deselectRowAtIndexPath(indexPath, animated: true)
    


    // MARK: MakaleTableViewCellDelegate

    func makaleTableViewCellDidTouchUpvote(cell: MakaleTableViewCell, sender: AnyObject) 
        // TODO: Implement Upvote
    

    func makaleTableViewCellDidTouchComment(cell: MakaleTableViewCell, sender: AnyObject) 
        performSegueWithIdentifier("CommentsSegue", sender: self)
    

    // MARK: Misc

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
        if segue.identifier == "WebSegue"   
            let toView = segue.destinationViewController as WebViewController
            let indexPath = sender as NSIndexPath
            let url = articles[indexPath.row]["article_url"].string!
            toView.url = url


            UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: UIStatusBarAnimation.Fade)

            toView.transitioningDelegate = transitionManager
        
    


【问题讨论】:

欢迎来到 Stack Overflow,请阅读this 文章,了解如何正确提问。您可以通过减少有问题的代码的代码量并说明您已经尝试解决问题的方法来大大改善您的问题。 谢谢。我的 Alamofire.request 返回零。我找不到解决方法。 调试。尝试在发送请求之前使用 println,打印您尝试访问的 URL 并将该 URL 粘贴到您的 Web 浏览器中,您是否获得任何数据。检查您是否获得任何数据。发布您收到的错误。只是一些关于如何帮助自己从社区中获得更好答案的简单提示 println(urlString) 返回正确的 url:yazar.io/api/article/feed/1 -->正确的 println(page) 返回:1 -->正确的 println(articles[]) 返回 nil。看来我无法正确解析数据 您能帮我在您的加载文章功能中打印您的文章吗?就在你设置 self.articles 之后 【参考方案1】:

此链接http://yazar.io/api/newspaper/1 给出了 404 错误,因此显然您会从请求中返回 nil。

【讨论】:

【参考方案2】:

您在请求中使用了 baseURL

 static func articleForSection(section: String, page: Int, response: (JSON) -> ())

        let urlString = baseURL + ResourcePath.Articles.description
        println(urlString)
        let parameters = [
            "page": toString(page)
        ]
        println(parameters)

        Alamofire.request(.GET, baseURL, parameters: parameters).responseJSON(_, _, data, _) -> Void in
            let articles = JSON(data ?? [])
            response(articles)
        
    

像这样将 baseURL 更改为 urlString

 Alamofire.request(.GET, urlString, parameters: parameters).responseJSON(_, _, data, _) -> Void in
        let articles = JSON(data ?? [])
        response(articles)
    

【讨论】:

以上是关于Swift Json - 从 API 获取数据的主要内容,如果未能解决你的问题,请参考以下文章

从 Api Swift 获取数据 [重复]

从 Swift 3 中的 API 获取 AVPlayer 中的视频

Swift 5:给定的数据不是有效的JSON(将数据从API加载到表格视图)

Swift 5:如何从 JSONDecoder().decode 获取数据?

如何在 Swift 中获取 JSON 数据并将其添加到 URL

在 Swift 中解析 JSON API [关闭]