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 获取数据的主要内容,如果未能解决你的问题,请参考以下文章
从 Swift 3 中的 API 获取 AVPlayer 中的视频
Swift 5:给定的数据不是有效的JSON(将数据从API加载到表格视图)
Swift 5:如何从 JSONDecoder().decode 获取数据?