说明:本文示例代码发送的请求均为http请求,需要对info.plist文件进行配置。如何配置,请参考https://github.com/HanGangAndHanMeimei/iOS9AdaptationTips

一、简单说明

  在iOS9.0之后,以前使用的NSURLConnection过期,苹果推荐使用NSURLSession来替换NSURLConnection完成网路请求相关操作。

  NSURLSession的使用非常简单,先根据会话对象创建一个请求Task,然后执行该Task即可。

 NSURLSessionTask本身是一个抽象类,在使用的时候,通常是根据具体的需求使用它的几个子类。关系如下:

  

二、发送GET请求

  使用NSURLSession发送GET请求的方法和NSURLConnection类似,整个过程如下:

    1)确定请求路径(一般由公司的后台开发人员以接口文档的方式提供),GET请求参数直接跟在URL后面

    2)创建请求对象(默认包含了请求头和请求方法【GET】),此步骤可以省略

    3)创建会话对象(NSURLSession)

    4)根据会话对象创建请求任务(NSURLSessionDataTask)

    5)执行Task

    6)当得到服务器返回的响应后,解析数据(XML|JSON|HTTP)

示例代码:

发生GET请求第一种方法

func GET1()

{

//对请求路径的说明

//http://120.25.226.186:32812/login?username=520it&pwd=520&type=JSON

//协议头+主机地址+接口名称+?+参数1&参数2&参数3

//协议头(http://)+主机地址(120.25.226.186:32812)+接口名称(login)+?+参数1(username=520it)&参数2(pwd=520)&参数3(type=JSON)

//GET请求,直接把请求参数跟在URL的后面以?隔开,多个参数之间以&符号拼接

//1.确定请求路径

var url: NSURL = NSURL(string: "http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON")!

//2.创建请求对象

//请求对象内部默认已经包含了请求头和请求方法(GET)

var request: NSURLRequest = NSURLRequest(URL: url)

//3.获得会话对象

var session: NSURLSession = NSURLSession.sharedSession()

//4.根据会话对象创建一个Task(发送请求)

/*

第一个参数:请求对象

第二个参数:completionHandler回调(请求完成【成功|失败】的回调)

data:响应体信息(期望的数据)

response:响应头信息,主要是对服务器端的描述

error:错误信息,如果请求失败,则error有值

*/

var dataTask: NSURLSessionDataTask = session.dataTaskWithRequest(request) { (data, response, error) in

if(error == nil){

//6.解析服务器返回的数据

//说明:(此处返回的数据是JSON格式的,因此使用NSJSONSerialization进行反序列化处理)

var dict:NSDictionary? = nil

do {

dict  = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.init(rawValue: 0)) as! NSDictionary

} catch {

}

print("%@",dict)

}

}

//5.执行任务

dataTask.resume()

}

发生GET请求第二种方法

func GET2()

{

//1.确定请求路径

var url:
NSURL =
NSURL(string:
"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON")!

//2.获得会话对象

var session:
NSURLSession = NSURLSession.sharedSession()

//3.根据会话对象创建一个Task(发送请求)

/*

第一个参数:请求路径

第二个参数:completionHandler回调(请求完成【成功|失败】的回调)

data:响应体信息(期望的数据)

response:响应头信息,主要是对服务器端的描述

error:错误信息,如果请求失败,则error有值

注意:

1)该方法内部会自动将请求路径包装成一个请求对象,该请求对象默认包含了请求头信息和请求方法(GET)

2)如果要发送的是POST请求,则不能使用该方法

*/

var dataTask:
NSURLSessionDataTask = session.dataTaskWithURL(url) { (data, response, error)
in

//5.解析数据

var dict:NSDictionary? =
nil

do {

dict  = try
NSJSONSerialization.JSONObjectWithData(data!, options:
NSJSONReadingOptions.init(rawValue:
0)) as!
NSDictionary

} catch {

}

print("%@",dict)

}

//4.执行任务

dataTask.resume()

}

 执行结果:

  

  此处打印的值是一个字典,字典中success这个key对应的value打印出来为Unicode编码的,如果想输出中文,可以为NSDictionary提供一个分类,重写系统中的方法。

  

//字典分类中重写系统的方法

func descriptionWithLocale(locale:
AnyObject,level:
NSInteger) ->NSString

{

//初始化可变字符串

var string:
NSMutableString =
NSMutableString()

//拼接开头[

string += "["

[string appendString:@"["];

//拼接字典中所有的键值对

[self enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {

[string appendFormat:@"%@:",key];

[string appendFormat:@"%@",obj];

}];

//拼接结尾]

[string appendString:@"]"];

return string

}

三、发送POST请求

  使用NSURLSession发送POST请求的方法和NSURLConnection类似,整个过程如下:

    1)确定请求路径(一般由公司的后台开发人员以接口文档的方式提供)

    2)创建可变的请求对象(因为需要修改),此步骤不可以省略

    3)修改请求方法为POST

    4)设置请求体,把参数转换为二进制数据并设置请求体

    5)创建会话对象(NSURLSession)

    6)根据会话对象创建请求任务(NSURLSessionDataTask)

    7)执行Task

    8)当得到服务器返回的响应后,解析数据(XML|JSON|HTTP)

  示例代码:

//发送POST请求NSURLSession

func POST()

{

//对请求路径的说明

//http://120.25.226.186:32812/login

//协议头+主机地址+接口名称

//协议头(http://)+主机地址(120.25.226.186:32812)+接口名称(login)

//POST请求需要修改请求方法为POST,并把参数转换为二进制数据设置为请求体

//1.创建会话对象

var session:
NSURLSession = NSURLSession.sharedSession()

//2.根据会话对象创建task

var url:
NSURL =
NSURL(string:
"http://120.25.226.186:32812/login")!

//3.创建可变的请求对象

var request:
NSMutableURLRequest =
NSMutableURLRequest(URL: url)

//4.修改请求方法为POST

request.HTTPMethod =
"POST"

//5.设置请求体

request.HTTPBody =
"username=520it&pwd=520it&type=JSON".dataUsingEncoding(NSUTF8StringEncoding)

//6.根据会话对象创建一个Task(发送请求)

/*

第一个参数:请求对象

第二个参数:completionHandler回调(请求完成【成功|失败】的回调)

data:响应体信息(期望的数据)

response:响应头信息,主要是对服务器端的描述

error:错误信息,如果请求失败,则error有值

*/

var dataTask:
NSURLSessionDataTask = session.dataTaskWithRequest(request) { (data, response, error)
in

//if(error == nil){

//8.解析数据

//说明:(此处返回的数据是JSON格式的,因此使用NSJSONSerialization进行反序列化处理)

var dict:NSDictionary? =
nil

do {

dict  = try
NSJSONSerialization.JSONObjectWithData(data!, options:
NSJSONReadingOptions.init(rawValue:
0)) as!
NSDictionary

} catch {

}

print("%@",dict)

//}

}

//5.执行任务

dataTask.resume()

}

四、NSURLSession代理方法简单介绍

有的时候,我们可能需要监听网络请求的过程(如下载文件需监听文件下载进度),那么就需要用到代理方法。接下来通过代码简单说明NSURLSession中普通网络请求会涉及代理方法的使用

private var _responseData:
NSMutableData!

var responseData:
NSMutableData!{

get{

if
_responseData ==
nil {

_responseData =
NSMutableData()

}

return
_responseData

}

set{

self._responseData = newValue

}

}

//当点击控制器View的时候会调用该方法

override
func touchesBegan(touches:
Set<UITouch>, withEvent event:
UIEvent?)

{

self.delegateTest()

}

//发送请求,代理方法

func delegateTest()

{

//1.确定请求路径

var url:
NSURL =
NSURL(string:
"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON")!

//2.创建请求对象

//请求对象内部默认已经包含了请求头和请求方法(GET)

var request:
NSURLRequest = NSURLRequest(URL: url)

//3.获得会话对象,并设置代理

/*

第一个参数:会话对象的配置信息defaultSessionConfiguration
表示默认配置

第二个参数:谁成为代理,此处为控制器本身即self

第三个参数:队列,该队列决定代理方法在哪个线程中调用,可以传主队列|非主队列

[NSOperationQueue mainQueue]   主队列:  
代理方法在主线程中调用

[[NSOperationQueue alloc]init] 非主队列:
代理方法在子线程中调用

*/

var session:
NSURLSession = NSURLSession(configuration:
NSURLSessionConfiguration.defaultSessionConfiguration(), delegate:
self, delegateQueue:
NSOperationQueue.mainQueue())

//4.根据会话对象创建一个Task(发送请求)

var dataTask:
NSURLSessionTask = session.dataTaskWithRequest(request)

//5.执行任务

dataTask.resume()

}

//1.接收到服务器响应的时候调用该方法

func URLSession(session:
NSURLSession, dataTask:
NSURLSessionDataTask, didReceiveResponse response:
NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) ->
Void) {

//在该方法中可以得到响应头信息,即response

print("didReceiveResponse--%@",NSThread.currentThread)

//注意:需要使用completionHandler回调告诉系统应该如何处理服务器返回的数据

//默认是取消的

/*

NSURLSessionResponseCancel = 0,        默认的处理方式,取消

NSURLSessionResponseAllow = 1,         接收服务器返回的数据

NSURLSessionResponseBecomeDownload = 2,变成一个下载请求

NSURLSessionResponseBecomeStream        变成一个流

*/

completionHandler(NSURLSessionResponseDisposition.Allow)

}

//2.接收到服务器返回数据的时候会调用该方法,如果数据较大那么该方法可能会调用多次

func URLSession(session:
NSURLSession, dataTask:
NSURLSessionDataTask, didReceiveData data:
NSData) {

print("didReceiveData--%@",NSThread.currentThread)

//拼接服务器返回的数据

self.responseData.appendData(data)

}

//3.当请求完成(成功|失败)的时候会调用该方法,如果请求失败,则error有值

func URLSession(session:
NSURLSession, task:
NSURLSessionTask, didCompleteWithError error:
NSError?) {

print("didCompleteWithError--%@",NSThread.currentThread)

if (error ==
nil) {

//解析数据,JSON解析请参考http://www.cnblogs.com/wendingding/p/3815303.html

var dict:NSDictionary? =
nil

do {

dict  = try
NSJSONSerialization.JSONObjectWithData(self.responseData,
options: NSJSONReadingOptions.init(rawValue:
0)) as!
NSDictionary

} catch {

}

print("%@",dict)

}

}

  代码执行结果:

  

swift开发网络篇—利用NSURLSession 发送GET和POST请求的更多相关文章

  1. swift开发网络篇—利用NSURLConnection GET请求和POST请求

    一.GET请求和POST请求简单说明 @IBOutlet weakvar userName:UITextField! @IBOutletweakvar userPwd:UITextField! @IB ...

  2. swift开发网络篇—NSURLConnection基本使用

    iOS开发网络篇—NSURLConnection基本使用 一.NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据 ...

  3. swift开发网络篇 - 网络基础

    GET & POST GET GET的语义是获取指定URL的资源 将数据按照variable=value的形式,添加到action所指向的URL后面,并且两者使用"?"连接 ...

  4. swift开发网络篇 - post 请求

    /** 所有网络请求,统一使用异步请求! 在今后的开发中,如果使用简单的get/head请求,可以用NSURLConnction异步方法 GET查/POST增/PUT改/DELETE删/HEAD GE ...

  5. swift开发网络篇 - 用户登录POST JSON and header

    版权声明:本文为博主原创文章,未经博主允许不得转载. import UIKit import Alamofire class ViewController: UIViewController { va ...

  6. iOS开发——网络篇——NSURLSession,下载、上传代理方法,利用NSURLSession断点下载,AFN基本使用,网络检测,NSURLConnection补充

    一.NSURLConnection补充 前面提到的NSURLConnection有些知识点需要补充 NSURLConnectionDataDelegate的代理方法有一下几个 - (void)conn ...

  7. iOS开发网络篇—发送GET和POST请求(使用NSURLSession)

    iOS开发网络篇—发送GET和POST请求(使用NSURLSession) 说明: 1)该文主要介绍如何使用NSURLSession来发送GET请求和POST请求 2)本文将不再讲解NSURLConn ...

  8. iOS开发网络篇—发送json数据给服务器以及多值参数

    iOS开发网络篇—发送json数据给服务器以及多值参数 一.发送JSON数据给服务器 发送JSON数据给服务器的步骤: (1)一定要使用POST请求 (2)设置请求头 (3)设置JSON数据为请求体 ...

  9. iOS开发网络篇—数据缓存

      iOS开发网络篇—数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造 ...

随机推荐

  1. 基于 Web 的 Go 语言 IDE - Wide 1.1.0 发布!

    发布 1.1.0 这个版本改进了很多细节,已经完全可以用于正式项目的开发 同时我们上线了 Wide 在线服务 到目前,我们提供了 Wide 和 Solo 两个在线服务,详情请看这里. Wide 是什么 ...

  2. 10款最好的Python IDE

    Python 的学习过程少不了集成开发环境(IDE)或者代码编辑器.这些 Python 开发工具帮助开发者加快使用 Python 开发的速度,提高效率.高效的代码编辑器或者 IDE 应该会提供插件,工 ...

  3. Codefroces Educational Round 26 837 C. Two Seals

    C. Two Seals time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  4. Windows学习总结(4)——Host文件的作用和如何修改Host文件

    本经验将为您介绍,什么是Host文件,Host文件作用,Host文件的位置等信息,以帮忙您了解Host文件. 方法/步骤 什么是HOST文件: Hosts是一个没有扩展名的系统文件,其基本作用就是将一 ...

  5. Maven学习详解(13)——Maven常用命令大全与pom文件讲解

    一.Maven常用命令 1.1.Maven 参数 -D 传入属性参数  -P 使用pom中指定的配置  -e 显示maven运行出错的信息  -o 离线执行命令,即不去远程仓库更新包  -X 显示ma ...

  6. php实现遍历文件目录

    php实现遍历文件目录 一.总结 1.熟悉简单:很经典的例子,多看,然后发现熟悉了很简单 二.php实现遍历目录 php实现遍历目录 代码一: //遍历目录 function iteral($path ...

  7. ELKstack 中文指南

    https://www.elastic.co/downloads ELKstack 中文指南 .net Elasticsearch 学习入门笔记   一. es安装相关1.elasticsearch安 ...

  8. POJ 1738 An old Stone Game(石子合并 经典)

    An old Stone Game Time Limit: 5000MS   Memory Limit: 30000K Total Submissions: 3672   Accepted: 1035 ...

  9. Flask设置配置文件

    Flask修改配置: from flask import Flask app = Flask(__name__) app.config['DEBUG'] = True @app.route('/') ...

  10. 【Codeforces Round #455 (Div. 2) B】Segments

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 处理出所有的线 其实就是区间. 总共有n*(n+1)/2个 然后按照左端点.右端点排序 每次取最左边的线. 多种可能就取右端点尽量小 ...