当前位置: 首页 > 科技观察

自己写一个iOS网络请求库——降低耦合_0

时间:2023-03-21 23:19:15 科技观察

开源项目:Pitaya,适合大文件上传的HTTP请求库:https://github.com/johnlui/Pitaya在本文中,我们将降低复杂度将前面的代码一起耦合,并使用适配器模式实现了一层独立于底层结构的网络API,创建了一个真正的网络请求“库”。如何降低耦合度如何降低耦合度现在的面条式代码虽然简单易懂,但是功能单一,代码杂乱。下面一起来分析一下NSURLSession的使用过程:构造NSURLRequest确定URL确定HTTP方法(GET、POST等)添加具体的HTTPheader填充HTTPBody驱动session.dataTaskWithRequest方法,开始请求具体实现在Network下再创建一个NetworkManager类,将SetURL、params、files等设置为成员变量,让它们在构造函数中初始化:,error:NSError!)->Voidletsession=NSURLSession.sharedSession()leturl:String!varrequest:NSMutableURLRequest!vartask:NSURLSessionTask!init(url:String,method:String,params:Dictionary=Dictionary(),回调:(数据:NSData!,response:NSURLResponse!,error:NSError!)->Void){self.url=urlself.request=NSMutableURLRequest(URL:NSURL(string:url)!)self.method=methodself.params=paramsself.callback=回调}},1.确定URL2。确定HTTP方法(GET、POST等)3、添加特定的HTTP头4、填充HTTPBody前三步封装成一个函数,最后一步封装成一个函数,然后驱动session。dataTaskWithRequest代码封装成一个函数:funcbuildRequest(){ifself.method="GET"&&self.params.count>0{self.request=NSMutableURLRequest(URL:NSURL(string:url+"?"+buildParams(self.params))!)}request.HTTPMethod=self.methodifself.params.count>0{request.addValue("application/x-www-form-urlencoded",forHTTPHeaderField:"Content-Type")}}funcbuildBody(){ifself.params.count>0&&self.method!="GET"{request.HTTPBody=buildParams(self.params).nsdata}}funcfireTask(){task=session.dataTaskWithRequest(request,completionHandler:{(data,response,error)->Voidinself.callback(data:data,response:response,error:error)})task.resume()}然后用统一的方法驱动上面三个函数完成请求:funcfire(){buildRequest()buildBody()fireTask()}同时,别忘了从Alamofire偷来的三个params函数,并把它放在这个类中。至此,降低耦合的工作基本完成,接下来我们开始封装“网络API”。使用适配器模式封装“网络API”理解适配器模式适配器模式是设计模式之一,很容易理解:我的APP需要一个函数来获取某个URL返回的字符串,我选择Alamofire现在,却是开发出来的火龙果看起来不错。以后想换成Pitaya,所以封装了一层自己的网络接口,屏蔽底层细节。到时候我只需要修改这个类,不需要深入到项目中改那么多接口。叫。适配器模式听起来很高大上,其实是我们日常编码中非常常见的一种设计模式。做吧!修改Network类的代码为:classNetwork{staticfuncrequest(method:String,url:String,params:Dictionary=Dictionary(),callback:(data:NSData!,response:NSURLResponse!,error:NSError!)->void){letmanager=NetworkManager(url:url,method:method,params:params,callback:callback)manager.fire()}}完成!封装多级接口不带参数:staticfuncrequest(method:String,url:String,callback:(data:NSData!,response:NSURLResponse!,error:NSError!)->Void){letmanager=NetworkManager(url:url,method:method,callback:callback)manager.fire()}两个get接口(带参数和不带参数):staticfuncget(url:String,callback:(data:NSData!,response:NSURLResponse!,error:NSError!)->Void){letmanager=NetworkManager(url:url,method:"GET",callback:callback)manager.fire()}staticfuncget(url:String,params:Dictionary,callback:(data:NSData!,response:NSURLResponse!,error:NSError!)->Void){letmanager=NetworkManager(url:url,method:"GET",params:params,callback:callback)manager.fire()}两个post接口(带params和不带params):staticfuncpost(url:String,callback:(data:NSData!,response:NSURLResponse!,error:NSError!)->Void){letmanager=NetworkManager(url:url,method:"POST",callback:callback)manager.fire()}staticfuncpost(url:String,params:Dictionary,callback:(data:NSData!,response:NSURLResponse!,error:NSError!)->Void){letmanager=NetworkManager(url:url,method:"POST",params:params,callback:callback)manager.fire()}测试接口修改ViewController中的调用代码,测试多级API:@IBActionfuncmainButtonBeTapped(sender:AnyObject){leturl="http://pitayaswift.sinaapp.com/pitaya.php"Network.post(url,callback:{(data,response,error)->Voidinprintln("POST1请求成功")})Network.post(url,params:["post":"POSTNetwork"],回调:{(数据,响应,错误)->Voidinletstring=NSString(数据:数据,编码:NSUTF8StringEncoding)as!Stringprintln(“POST2请求成功”+字符串)})Network.get(url,回调:{(数据,response,error)->Voidinprintln("GET1请求成功")})Network.get(url,params:["get":"POSTNetwork"],callback:{(data,response,error)->Voidinletstring=NSString(data:data,encoding:NSUTF8StringEncoding)as!Stringprintln("GET2请求成功"+string)})Network.request("GET",url:url,params:["get":"RequestNetwork"]){(data,response,error)->Voidinletstring=NSString(data:data,encoding:NSUTF8StringEncoding)as!Stringprintln("Request请求成功"+string)}}运行项目,点击按钮查看效果:多级API封装成功!