在ios开发中,网络请求是不可以少的,说到网络请求可能用的最多的就是第三方的比人比较有名的AFNetworking、Alamofire等,原生的用的少。今天就用ios提供的原生方法来打造属于自己的一个网络请求工具吧。大神的成长之路,现在就开始起航。

第一步:先建一个类比如叫 Http 如下:

//定义请求类型

enum HttpMethod {

case GET,

POST

}

//在http中定义类方法来做请求,方便使用

class Http {

class func request(method:HttpMethod, url:String,params:[String:Any]=[:],complete: @escaping(_result:String)->Void,error:@escaping(_error:Error?)->Void){

var url = url

//处理参数为了方便这里抽取里一个方法来处理参数

let param =self.parserParams(params: params)

//设置get请求参数

ifmethod == .GET&&param != ""{

if url.contains("?"){

url.append("&\(param)")

}else{

url.append("?\(param)")

}

}

// 注意这里需要将含有中文的参数进行编码处理,否则创建URL 对象就会返回nil。

url = url.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)!

let_url =URL(string: url)!

let request =NSMutableURLRequest(url: _url)

//设置超时时间

request.timeoutInterval=50

//设置请求方式

request.httpMethod= method == .GET?"GET":"POST"

//设置post请求参数

if method == .POST&& param != ""{

request.httpBody=param.data(using: .utf8)

}

let session =URLSession.shared

let httpTask = session.dataTask(with: request as URLRequest) { (data,response ,err ) in

//在主线程中回调方便在界面处理数据逻辑

OperationQueue.main.addOperation {

if err !=nil{

//错误回调

error(err)

return

}

//请求成功将结果返回

complete(String(data: data!, encoding:String.Encoding.utf8)!)

}

}

//启动任务

httpTask.resume()

}

//将字典转换成网络请求的参数字符串

private class func parserParams(params:[String:Any])->String{

var newStr=""

for param in params{

newStr.append("\(param.key)=\(param.value)&")

}

return newStr

}

}

第二步开始测试:在viewcontroller中调用,

class ViewController:UIViewController{

override func viewDidLoad() {

super.viewDidLoad()

let url = "http://api.budejie.com/api/api_open.php"

Http.request(method: .GET, url: url, params: ["a":"list","c":"data","type":1], complete: {r in

print("请求结果:",r)

}, error:{error in

print("请求出错了:",error.debugDescription)

})

至此就这个简单的http请求工具就写好了,是不是很简单呢? 如果觉得可以记得关注我哦,如果有什么问题欢迎留言!

简书地址: Code人生 欢迎关注

最新文章

  1. 快速Android开发系列网络篇之Android-Async-Http
  2. 读书笔记--SQL必知必会19--存储过程
  3. 如何在C#中获得input文本框中的值
  4. Centos 6.5使用Bumblebee关闭N卡,冷却你的电脑
  5. SQLserver中的常量与变量、判断循环语句
  6. 使用Yeoman搭建 AngularJS 应用 (1) —— 介绍
  7. go(一)变量
  8. TextUtils判断
  9. jQuery删除DOM节点
  10. SQL SERVER:CASE判断空,错误一例
  11. C# 比较两文本相似度
  12. 生产apollo搭建记录(五)
  13. 织梦后台如何生成站点地图sitemap.xml
  14. Unity3d外包-就找北京动点软件
  15. js将接口返回的数据序列化
  16. 字符串全部转换为大写用str.toUpperCase()方法
  17. UI基础:UIControl及其子类
  18. jQuery UI 给button添加ID
  19. 设计模式:组合(Composite)模式
  20. crush class实验

热门文章

  1. 第十四届华中科技大学程序设计竞赛决赛同步赛 A - Beauty of Trees
  2. Oracle OCP提纲
  3. python-xlrd api
  4. leetcode377
  5. 浅谈Android四大组建之一Service---Service的创建
  6. 阿里云服务器访问github慢临时解决方法
  7. madplay的使用方法
  8. 动态参数 名称空间 作用域 作用域链 加载顺序 函数的嵌套 global nonlocal 等的用法总结
  9. PHP的count(数组)和strlen(字符串)的内部实现
  10. c++ 子类切勿重新定义父类 non-virtual函数