Swift语言IOS8开发战记25 网络通信Get和Post方式

Get是从服务器上获取数据,Post是向服务器传送数据。对于Get方式,服务器端用Requset.QueryString获取变量的值,对于Post方式,服务器端用Request.Form获取提交的数据。Get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内个个字段一一对应,在URL中可以看到。Post是通过HTTP Post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

Get安全性非常低,Post安全性较高,但是Get方式的执行效率比Post好。

所以建议使用Get做查询,使用Post做增、删、改。

在开发战记第24话中我们使用的同步获取天气信息的方法就是一种Get方式的同步请求,请看以下代码:

import UIKitclass ViewController: UIViewController {@IBAction func showWeatherJson(sender: UIButton) {//创建urlvar url:NSURL! = NSURL(string: "")//创建请求对象var urlRequest:NSURLRequest = NSURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 10)//创建响应对象var response:NSURLResponse?//创建错误对象var error:NSError?//发出请求var data:NSData? = NSURLConnection.sendSynchronousRequest(urlRequest, returningResponse: &response, error: &error)if error != nil{println(error?.code)println(error?.description)} else {var jsonString = NSString(data: data!, encoding: NSUTF8StringEncoding)println(jsonString)}}}

这里创建NSURLRequest对象的时候,使用了一个更加复杂的构造器:

URL参数:请求路径

cachePolicy参数:缓存协议

timeoutInterval参数:网络请求超时时间(单位:秒)

缓存协议是个枚举类型:

enum NSURLRequestCachePolicy : UInt {case UseProtocolCachePolicy//基础策略case ReloadIgnoringLocalCacheData//忽略本地缓存case ReloadIgnoringLocalAndRemoteCacheData // Unimplemented 无视任何缓存策略,总是从源地址重新下载case ReturnCacheDataElseLoad //首先使用缓存,没有本地缓存,才用源地址下载case ReturnCacheDataDontLoad //使用本地缓存,从不下载,如果没有本地缓存,则请求失败,此策略多用于离线操作case ReloadRevalidatingCacheData // Unimplemented 如果本地缓存是有效的则不下载,其他任何情况都从源地址重新下载}下面介绍异步Get请求方式: func asynchronousGet() {//创建NSURL对象var url:NSURL! = NSURL(string: "<span style="font-family: Arial, Helvetica, sans-serif;">?type=focus-c</span><span style="font-family: Arial, Helvetica, sans-serif;">")//参数直接写到路径中</span>//创建请求对象var urlRequest:NSURLRequest = NSURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 10)//网络连接对象var conn:NSURLConnection? = NSURLConnection(request: urlRequest, delegate: self)}在连接了服务器之后,,使用下面两个异步请求的代理方法NSURLConnectionDataDelegate,来接收相关数据。

func connection(connection: NSURLConnection, didReceiveResponse response: NSURLResponse) {//接收响应}var jsonData:NSMutableData = NSMutableData()func connection(connection: NSURLConnection, didReceiveData data: NSData) {//收到数据,此方法根据数据大小执行若干次jsonData.appendData(data)}同步Post方法如下,把参数放到HTTP的body中,安全性比较高

import UIKitclass ViewController: UIViewController {@IBAction func showWeatherJson(sender: UIButton) {//创建urlvar url:NSURL! = NSURL(string: "")//创建请求对象var urlRequest:NSMutableURLRequest = NSMutableURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 10)urlRequest.HTTPMethod = "POST"//设置请求方式为POST,默认为GETvar str:String = "type=focus-c"//设置参数var data:NSData = str.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!urlRequest.HTTPBody = data//创建响应对象var response:NSURLResponse?//创建错误对象var error:NSError?//发出请求var received:NSData? = NSURLConnection.sendSynchronousRequest(urlRequest, returningResponse: &response, error: &error)if error != nil{println(error?.code)println(error?.description)} else {var jsonString = NSString(data: received!, encoding: NSUTF8StringEncoding)println(jsonString)}}}异步Post请求方式如下:

var url:NSURL! = NSURL(string: "")//创建请求对象var urlRequest:NSMutableURLRequest = NSMutableURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 10)urlRequest.HTTPMethod = "POST"//设置请求方式为POST,默认为GETvar str:String = "type=focus-c"//设置参数var data:NSData = str.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!urlRequest.HTTPBody = datavar connection = NSURLConnection(request: urlRequest, delegate: self)然后就可以在代理方法中进行操作了。

读书须用意,一字值千金。

Swift语言IOS8开发战记25 网络通信Get和Post方式

相关文章:

你感兴趣的文章:

标签云: