使用Alamofire,Ji进行的数据请求

//要调用的方法

func refresh(){

//如果有上拉加载更多 正在执行,则取消它

if self.tableView.mj_footer.isRefreshing() {

self.tableView.mj_footer.endRefreshing()

}

//根据 tab name 获取帖子列表

TopicListModel.getTopicList(tab){

(response:V2ValueResponse<[TopicListModel]>) -> Void in

if response.success {

//var topicList:Array<TopicListModel>?

self.topicList = response.value

self.tableView.reloadData()

//判断标签是否能加载下一页, 不能就提示下

let refreshFooter = self.tableView.mj_footer as! V2RefreshFooter

if self.tab == nil || self.tab == "all" {

refreshFooter.noMoreDataStateString = nil

refreshFooter.resetNoMoreData()

}

else{

}

//重置page

self.currentPage = 0

}

self.tableView.mj_header.endRefreshing()

}

}

//////////////////

//用户代理,使用这个切换是获取 m站点 还是www站数据

let USER_AGENT = "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4";

let MOBILE_CLIENT_HEADERS = ["user-agent":USER_AGENT]

////////////////////

//MARK: - Request

extension TopicListModel {

/**

获取首页帖子列表

- parameter tab:               tab名

*/

class func getTopicList(

_ tab: String? = nil ,

page:Int = 0 ,

completionHandler: @escaping (V2ValueResponse<[TopicListModel]>) -> Void

)->Void{

var params:[String:String] = [:]

if let tab = tab {

params["tab"]=tab

}

else {

params["tab"] = "all"

}

var url = V2EXURL

if params["tab"] == "all" && page > 0 {

params.removeAll()

params["p"] = "\(page)"

url = V2EXURL + "recent"

}

Alamofire.request(url, parameters: params, headers: MOBILE_CLIENT_HEADERS).responseJiHtml { (response) -> Void in

var resultArray:[TopicListModel] = []

if  let jiHtml = response.result.value{

if let aRootNode = jiHtml.xPath("//body/div[@id=‘Wrapper‘]/div[@class=‘content‘]/div[@class=‘box‘]/div[@class=‘cell item‘]"){

for aNode in aRootNode {

let topic = TopicListModel(rootNode:aNode)

resultArray.append(topic);

}

//更新通知数量

V2User.sharedInstance.getNotificationsCount(jiHtml.rootNode!)

}

DispatchQueue.global().async {

//领取奖励

if let aRootNode = jiHtml.xPath("//body/div[@id=‘Wrapper‘]/div[@class=‘content‘]/div[@class=‘box‘]/div[@class=‘inner‘]/a[@href=‘/mission/daily‘]")?.first {

if aRootNode.content == "领取今日的登录奖励" {

print("有登录奖励可领取")

UserModel.dailyRedeem()

}

}

}

}

let t = V2ValueResponse<[TopicListModel]>(value:resultArray, success: response.result.isSuccess)

completionHandler(t);

}

}

////////////////////////////

//  Request+Extension.swift

import Foundation

import Alamofire

import Ji

extension DataRequest {

enum ErrorCode: Int {

case noData = 1

case dataSerializationFailed = 2

}

internal static func newError(_ code: ErrorCode, failureReason: String) -> NSError {

let errorDomain = "me.fin.v2ex.error"

let userInfo = [NSLocalizedFailureReasonErrorKey: failureReason]

let returnError = NSError(domain: errorDomain, code: code.rawValue, userInfo: userInfo)

return returnError

}

static func JIHTMLResponseSerializer() -> DataResponseSerializer<Ji> {

return DataResponseSerializer { request, response, data, error in

guard error == nil else { return .failure(error!) }

guard let validData = data else {

return .failure(AFError.responseSerializationFailed(reason: .inputDataNil))

}

if  let jiHtml = Ji(htmlData: validData){

return .success(jiHtml)

}

let failureReason = "ObjectMapper failed to serialize response."

let error = newError(.dataSerializationFailed, failureReason: failureReason)

return .failure(error)

}

}

@discardableResult

public func responseJiHtml(queue: DispatchQueue? = nil,  completionHandler: @escaping (DataResponse<Ji>) -> Void) -> Self {

return response(responseSerializer: Alamofire.DataRequest.JIHTMLResponseSerializer(), completionHandler: completionHandler);

}

}

//////////////////////////////

//  TopicListModel.swift

init(rootNode: JiNode) {

super.init()

self.avata = rootNode.xPath("./table/tr/td[1]/a[1]/img[@class=‘avatar‘]").first?["src"]

self.nodeName = rootNode.xPath("./table/tr/td[3]/span[1]/a[1]").first?.content

self.userName = rootNode.xPath("./table/tr/td[3]/span[1]/strong[1]/a[1]").first?.content

let node = rootNode.xPath("./table/tr/td[3]/span[2]/a[1]").first

self.topicTitle = node?.content

self.setupTitleLayout()

var topicIdUrl = node?["href"];

if var id = topicIdUrl {

if let range = id.range(of: "/t/") {

id.replaceSubrange(range, with: "");

}

if let range = id.range(of: "#") {

id = id.substring(to: range.lowerBound)

topicIdUrl = id

}

}

self.topicId = topicIdUrl

self.date = rootNode.xPath("./table/tr/td[3]/span[3]").first?.content

var lastReplyUserName:String? = nil

if let lastReplyUser = rootNode.xPath("./table/tr/td[3]/span[3]/strong[1]/a[1]").first{

lastReplyUserName = lastReplyUser.content

}

self.lastReplyUserName = lastReplyUserName

var replies:String? = nil;

if let reply = rootNode.xPath("./table/tr/td[4]/a[1]").first {

replies = reply.content

}

self.replies  = replies

}

///////////////////////

//要请求解析的HTML文件地址:view-source:https://www.v2ex.com/my/nodes

//用谷歌浏览器打开

时间: 2024-10-10 13:13:44

使用Alamofire,Ji进行的数据请求的相关文章

XML 数据请求与JSON 数据请求

(1)XML 数据请求 使用 AFNetworking 中的 AFHTTPRequestOperation 和 AFXMLParserResponseSerializer,另外结合第三方框架 XMLDictionary 进行数据转换 使用 XMLDictionary 的好处:有效避免自行实现 NSXMLParserDelegate 委托代理协议方法来进行繁琐的数据拼凑解析 (2)JSON 数据请求 使用 AFNetworking 中的 AFHTTPRequestOperation 或 AFHTT

微信小程序数据请求方法wx.request小测试

微信小程序数据请求方法 wx.request wxml文件: <view> <textarea value="{{textdata}}"/> </view> <button bindtap="RequestData" value="Button">Button</button> 主要是一个按钮,点击后将请求的数据写入到textarea中 js文件: Page({ data:{ textd

Ajax --- 数据请求

下面主要介绍(JS原生)数据请求的主要步骤: Ajax 数据请求步骤: 1.创建XMLHttpRequest对象 2.准备数据发送 3.执行发送 4.指定回掉函数 第一步:创建XMLHttpRequest对象 1 var xhr = new XMLHttpRequest(); // 标准浏览器 2 3 var xhr = new ActiveXObject('Microsoft.XMLHTTP'); // IE6 第二步:使用 open() 方法将参数传入 1 xhr.open('get','.

iOS开发——网络编程OC篇&amp;数据请求总结

数据请求总结 1 //**************************************GET 2 //同步 3 /* 4 //第一步,创建URL 5 NSURL * url = [[NSURL alloc]initWithString:@"http://e.hiphotos.baidu.com/image/w%3D1366%3Bcrop%3D0%2C0%2C1366%2C768/sign=66f9b9980ef431adbcd2473a7d0097cc/08f790529822720

ajax 里的数据请求

今天给大家讲讲前端怎样通过ajax里的 get 和post两种方法来发送数据请求 首先,我们先知道 ajax里的get  post里有两个属性, open(),send().还要区分同步请求还是异步请求 在我们以后参加工作的时候用的比较多的都是异步请求 true: 那我们先来说说异步的请求方法 当然这里也不能漏了同步请求 上面的 是通过get的方法来请求的 date.json是我需要请求的数据地址 这里大家知道怎么请求的方法就可以了 一般你在参加工作之后会有后端的数据库人员会给你相应的数据库地址

使用 AFNetworking 进行 XML 和 JSON 数据请求

(1)XML 数据请求 使用 AFNetworking 中的 AFHTTPRequestOperation 和 AFXMLParserResponseSerializer,另外结合第三方框架 XMLDictionary 进行数据转换 使用 XMLDictionary 的好处:有效避免自行实现 NSXMLParserDelegate 委托代理协议方法来进行繁琐的数据拼凑解析 (2)JSON 数据请求 使用 AFNetworking 中的 AFHTTPRequestOperation 或 AFHTT

ios NSURLRequest NSMutableURLRequest 数据请求

get 请求 #pragma mark - GET登录 - (void)getLogon { // 1. URL NSString *urlStr = [NSString stringWithFormat:@"http://localhost/login.php?username=%@&password=%@", self.userName.text, self.userPwd.text]; NSURL *url = [NSURL URLWithString:urlStr];

java 接口自动化测试之数据请求的简单封装

我们自己用java写接口自动化测试框架或者做个接口自动化测试平台的话,是需要自己进行相关的请求的,因此我们需要简单的封装下httpclient,我新建了一个http工具类,将get方法和post方法进行了一个简单的封装. 如果是开发的话,比如APP开发,无论是iOS还是Android,是需要将数据请求进行十分严密的封装的,因为需要对各种网络状态,请求状态做相应的判断处理,因为需要通过这些判断来做出相应的UI交互界面来给用户提示,那么我们做接口测试的话是不需要这么严密的,因为测试的前提就是要保证测

get post 数据请求

Get :所有参数在路径里  直接放到浏览器可以看到 不安全 Post:部分参数在路径里 安全 Get请求和Post请求区别 1.get请求是将所有参数直接放到URL地址上,使用简单,但是用户的隐藏信息会暴露在外面 2.post请求是将一部分或者全部的参数放在一个body体里,转成data形式传送给服务器,外界不易截取,安全性高 同步:单线程 异步:多线程 同步与异步的区别 1.同步是单线程,执行任务以主线程为主,一个任务执行完了之后在执行下一个任务 2.异步是多线程,在主线程的基础上又开辟了一