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

简介: Get是从服务器上获取数据,Post是向服务器传送数据。对于Get方式,服务器端用Requset.QueryString获取变量的值,对于Post方式,服务器端用Request.Form获取提交的数据。

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 UIKit

class ViewController: UIViewController {

    @IBAction func showWeatherJson(sender: UIButton) {
        //创建url
        var url:NSURL! = NSURL(string: "http://www.weather.com.cn/adat/sk/101010100.html")
       //创建请求对象
        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;">http://api.hudong.com/iphonexml.do?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 UIKit

class ViewController: UIViewController {

    @IBAction func showWeatherJson(sender: UIButton) {
        //创建url
        var url:NSURL! = NSURL(string: "http://api.hudong.com/iphonexml.do")
       //创建请求对象
        var urlRequest:NSMutableURLRequest = NSMutableURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 10)
        
    urlRequest.HTTPMethod = "POST"//设置请求方式为POST,默认为GET
        var 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: "http://api.hudong.com/iphonexml.do")
       //创建请求对象
        var urlRequest:NSMutableURLRequest = NSMutableURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 10)
        
    urlRequest.HTTPMethod = "POST"//设置请求方式为POST,默认为GET
        var str:String = "type=focus-c"//设置参数
        var data:NSData = str.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!
        urlRequest.HTTPBody = data
        var connection = NSURLConnection(request: urlRequest, delegate: self)

然后就可以在代理方法中进行操作了。




目录
相关文章
|
19天前
Vite使用svg-企业级开发(支持本地svg和网络svg渲染)
本教程介绍如何在Vite项目中集成SVG图标插件。首先安装`vite-plugin-svg-icons`,配置插件指向SVG图标目录,并注册全局组件。接着创建SVG图标组件,支持内部图标与外部图片展示。通过简单配置,即可在页面中灵活使用各类SVG图标,提升开发效率。
73 0
|
4月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
250 61
|
4月前
|
开发者
鸿蒙仓颉语言开发教程:网络请求和数据解析
本文介绍了在仓颉开发语言中实现网络请求的方法,以购物应用的分类列表为例,详细讲解了从权限配置、发起请求到数据解析的全过程。通过示例代码,帮助开发者快速掌握如何在网络请求中处理数据并展示到页面上,减少开发中的摸索成本。
鸿蒙仓颉语言开发教程:网络请求和数据解析
|
5月前
|
API Swift iOS开发
回顾Apple Swift语言的发展和版本演变历程
归纳起来,Swift的发展过程就像一个乡村孩子的成长故事,从一个不谙世事的孩子,通过不懈的学习和实践,让自身的潜力得到最大的发挥,最终成为了社会中有实力的一份子。而这个故事还在继续,让我们共同期待Swift未来的激动人心的篇章!
131 20
|
4月前
|
监控 安全 网络协议
恶意软件无处逃!国内版“Manus”AiPy开发Windows沙箱工具,进程行为+网络传输层级监控! 头像 豪气的
NImplant.exe 是一款后渗透测试工具,可实现远程管理与持久化控制。其优点包括无文件技术、加密通信和插件扩展,但也存在被检测风险及配置复杂等问题。为深入分析其行为,我们基于 aipy 开发了 Windows 沙箱工具,针对桌面上的 NImplant.exe 进行多维度分析,涵盖进程行为、网络连接(如 TCP 请求、目标 IP/域名)、文件控制等,并生成传输层监控报告与沙箱截图。结果显示,aipy 工具响应迅速,报告清晰易读,满足分析需求。
|
7月前
|
网络协议 物联网
VB6网络通信软件上位机开发,TCP网络通信,读写数据并处理,完整源码下载
本文介绍使用VB6开发网络通信上位机客户端程序,涵盖Winsock控件的引入与使用,包括连接服务端、发送数据(如通过`Winsock1.SendData`方法)及接收数据(利用`Winsock1_DataArrival`事件)。代码实现TCP网络通信,可读写并处理16进制数据,适用于自动化和工业控制领域。提供完整源码下载,适合学习VB6网络程序开发。 下载链接:[完整源码](http://xzios.cn:86/WJGL/DownLoadDetial?Id=20)
244 12
|
Unix 调度 Swift
苹果iOS新手开发之Swift 中获取时间戳有哪些方式?
在Swift中获取时间戳有四种常见方式:1) 使用`Date`对象获取秒级或毫秒级时间戳;2) 通过`CFAbsoluteTimeGetCurrent`获取Core Foundation的秒数,需转换为Unix时间戳;3) 使用`DispatchTime.now()`获取纳秒级精度的调度时间点;4) `ProcessInfo`提供设备启动后的秒数,不表示绝对时间。不同方法适用于不同的精度和场景需求。
520 3
|
11月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
245 2
|
11月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
203 1

热门文章

最新文章