分类 网络 下的文章

发送http请求(get,post)

//
//  ViewController.swift
//  http请求
//
//  Created by admin on 16/2/26.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.post()
    }
    func post()
    {
        let urlStr = "http://test.com/login.php"
        // url中含有中文的话需要编码下
        let url = NSURL(string: urlStr.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!)

        // 初始化可变请求,用以之后改变对象的属性
        let request = NSMutableURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringCacheData, timeoutInterval: 10)
        request.HTTPMethod = "post"
        // 设置post数据,为字符串格式
        let postData = "username=张三&password=zhang"
        // 设置请求的data,需要转换成二进制的数据类型
        request.HTTPBody = postData.dataUsingEncoding(NSUTF8StringEncoding)
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { (responce:NSURLResponse?, data:NSData?, error:NSError?) -> Void in
            if data != nil
            {
                let json:AnyObject? = try? NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)
                print(json)
            }

        }
    }
    func get()
    {
        let urlStr = "http://test.com/login.php?username=张三&password=zhang"
        // url中含有中文的话需要编码下
        let url = NSURL(string: urlStr.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!)
        let request = NSURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringCacheData, timeoutInterval: 10)
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { (responce:NSURLResponse?, data:NSData?, error:NSError?) -> Void in
            if data != nil
            {
                let json:AnyObject? = try? NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)
                print(json)
            }

        }
    }
}

xml解析(DOM)

//
//  ViewController.swift
//  xml解析
//
//  Created by zhang on 16/2/25.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.decodeXML()
    }
    /**
     使用步骤
     First add the files from the Pod/Classes folder in this project to your source tree, then include them somewhere in your code,

     In Xcode choose the project file (in the project navigator, the top item).

     In the list choose your project target and select 'Build Settings' at the top of the window. Then you should see a list of build options.

     Add this line to 'Header Search Paths' (use search bar to find the right option) /usr/include/libxml2

     Add this line to 'Other Linker Flags': -lxml2
     */
    func decodeXML()
    {
        let url = NSURL(string: "http://localhost/videos.xml")
        let request = NSURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringCacheData, timeoutInterval: 10)
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { (response:NSURLResponse?, data:NSData?, error:NSError?) -> Void in

            // 实例化GDataXMLDocument
            let xml:GDataXMLDocument! = try? GDataXMLDocument(data: data!)
            // 循环根节点的子节点
            for element in xml.rootElement().children()
            {
                let video = Video()
                // 循环数据节点的属性并完成赋值
                for videoElment in element.children()
                {
                    video.setValue(videoElment.stringValue, forKey: videoElment.name)
                }
                // 去除节点属性值对象数组
                let attrs = element.valueForKey("attributes")! as! [GDataXMLNode]
                // 完成对象属性的赋值
                for attr in attrs
                {
                    video.setValue(attr.stringValue(), forKey: attr.name())
                }
            }
        }
    }
    func useNSNumber()
    {
        let url = NSURL(string: "http://localhost/demo.json")
        let request = NSURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringCacheData, timeoutInterval: 10)
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { (response:NSURLResponse?, data:NSData?, error:NSError?) -> Void in
            print(data)
            if data != nil
            {
                let json:AnyObject! = try? NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)
                let mes = Message()
                mes.setValuesForKeysWithDictionary(json as! [String : AnyObject])
                print(mes.valueForKey("messageId"))

            }
        }
    }
}
class Message:NSObject {
    // 数据类型为int的时候当服务器返回 null 的时候会抱下面的错误,用 NSNumber 就不会
    // this class is not key value coding-compliant for the key messageId
    var messageId:NSNumber!
    var message:String!
}
class Video:NSObject {
    var name:String!
    var length:String!
    var videoURL:String!
    var imageURL:String!
    var desc:String!
    var teacher:String!
    var videoId:String!
}

xml解析(SAX)

//
//  ViewController.swift
//  xml解析
//
//  Created by admin on 16/2/25.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit

class ViewController: UITableViewController,NSXMLParserDelegate {

    lazy var videos:[Video] = []
    lazy var nodeString:String = ""
    override func viewDidLoad() {
        super.viewDidLoad()
        self.decodeXml()

    }
    @IBAction func decodeXml()
    {
        let url = NSURL(string: "http://test.com/videos.xml")
        // 忽略缓存数据
        let request = NSURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringCacheData, timeoutInterval: 10)
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { [weak self] (response:NSURLResponse?, data:NSData?, error:NSError?) -> Void in
            let xml = NSXMLParser(data: data!)
            xml.delegate = self
            xml.parse()
        }
    }
    // 开始解析文档
    func parserDidStartDocument(parser: NSXMLParser)
    {
        self.videos.removeAll()
    }

    // 开始节点
    func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String])
    {
        if elementName == "video"
        {
            self.videos.append(Video())
        }
        self.nodeString = ""
    }

    // 获得文本内容
    func parser(parser: NSXMLParser, foundCharacters string: String)
    {
        self.nodeString = "\(self.nodeString)\(string)"
    }
    // 结束节点
    func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?)
    {
        if elementName != "video" && elementName != "videos"
        {
            self.videos[self.videos.count - 1].setValue(self.nodeString, forKey: elementName)
        }
    }
    // 结束解析文档
    func parserDidEndDocument(parser: NSXMLParser)
    {
        self.tableView.reloadData()
        self.refreshControl?.endRefreshing()
    }
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let identifer = "xmlCell"
        var cell:UITableViewCell! = tableView.dequeueReusableCellWithIdentifier(identifer)
        if cell == nil
        {
            cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: identifer)
        }
        cell.textLabel?.text = self.videos[indexPath.row].name
        cell.detailTextLabel?.text = self.videos[indexPath.row].videoURL
        return cell
    }
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.videos.count
    }
}
class Video:NSObject {
    var name:String!
    var length:String!
    var videoURL:String!
    var imageURL:String!
    var desc:String!
    var teacher:String!
}

服务器返回数据解析(json,plist)

//
//  ViewController.swift
//  数据解析-json
//
//  Created by admin on 16/2/25.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.plistDecodeC()
        // Do any additional setup after loading the view, typically from a nib.
    }
    func plistDecodeC()
    {
        // url
        let url = NSURL(string: "http://test.com/plist")
        // 请求
        let request = NSURLRequest(URL: url!)
        // 发送请求
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { (responce:NSURLResponse?, data:NSData?, error:NSError?) -> Void in
            // 转换后使用
            let plist:AnyObject? = NSPropertyListSerialization.propertyListFromData(data!, mutabilityOption: NSPropertyListMutabilityOptions.MutableContainers, format: nil, errorDescription: nil)
            // 使用
            print(plist)
            print(plist?.valueForKey("CFBundleDevelopmentRegion"))
            print(plist?.valueForKey("NSAppTransportSecurity"))
        }
    }
    /**
     {
     "statuses": [
     "3382905382185354",
     "3382905252160340",
     "3382905235630562",
     ],
     "previous_cursor": 0,
     "next_cursor": 0,
     "total_number": 16
     }
     */
    func jsonDecodeB()
    {
        // url
        let url = NSURL(string: "http://test.com/jsonA")
        // 请求
        let request = NSURLRequest(URL: url!)
        // 发送请求
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { (responce:NSURLResponse?, data:NSData?, error:NSError?) -> Void in
            // 转换后使用
            let json:AnyObject? = JSONDecoder().objectWithData(data!)
            // 全部都是nil。。。。
            print(json)
            print(json?.valueForKey("statuses"))
            print(json?.valueForKey("next_cursor"))
        }
    }
    func jsonDecodeA()
    {
        // url
        let url = NSURL(string: "http://test.com/jsonA")
        // 请求
        let request = NSURLRequest(URL: url!)
        // 发送请求
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { (responce:NSURLResponse?, data:NSData?, error:NSError?) -> Void in
            // 转换后使用
            let json:AnyObject? = try? NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)
            // 取出使用,都是可选类型,有点蛋疼啊
            print(json?.valueForKey("statuses"))
            print(json?.valueForKey("next_cursor"))
        }
    }
}

swift发送http请求的基本使用

//
//  ViewController.swift
//  网络
//
//  Created by admin on 16/2/25.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    let webView = UIWebView(frame: UIScreen.mainScreen().bounds)
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.addSubview(self.webView)
        self.requestB()
    }

    // 发送请求,NSURLConnection,同步
    func requestC()
    {
        // 确定url
        let url = NSURL(string: "https://m.baidu.com")
        // 设置请求
        let request = NSURLRequest(URL: url!)
        var responce:NSURLResponse?
        // 发送请求,NSURLConnection会出警告,所以使用NSURLSession
        let responceData:NSData? = try! NSURLConnection.sendSynchronousRequest(request, returningResponse: &responce)
        self.webView.loadHTMLString(String(data: responceData!, encoding: NSUTF8StringEncoding)!, baseURL: nil)
    }
    // 发送请求,NSURLConnection会出警告,所以使用NSURLSession,异步的
    func requestA()
    {
        // 确定url
        let url = NSURL(string: "https://m.baidu.com")
        // 设置请求
        /**
        参数:url:资源路径
        cachePolicy:缓存策略
        NSURLRequestUseProtocolCachePolicy = 0, // 默认缓存策略,会自动缓存

        NSURLRequestReload(刷新)Ignoring(忽略)Local(本地)CacheData(缓存数据) = 1, 每次都从服务器去加载数据。忽略本地缓存

        **** 底下两个 一般来离线访问。一般配合Reachability(苹果提供的检测网络连接的框架)使用
        // 如果用户使用的wifi,就使用这个策略
        NSURLRequestReturnCacheDataElseLoad = 2, // 如果有缓存,就用缓存。没有就上网加载
        // 如果用户使用的3G,就使用下面的策略
        NSURLRequestReturnCacheDataDontLoad = 3, // 如没有缓存,就用缓存。没有返回空,死活不上网


        timeoutInterval:超时时间,默认是60秒,一般设置15~20秒。超过这个时间以后,如果服务器还没有相应,就不继续等待了
        SDWebImage超时时长设置的是-->15秒
        AFN超时时长 60秒
        */
        let request = NSURLRequest(URL: url!)
        // 发送请求
        /**
        参数:Request 请求
        queue: 队列,这个队列,是完成以后,回调block执行的队列、
        Asynchronous:只要是异步,肯定会开新的线程

        // 使用场景:如果下载的是压缩包,解压缩也是耗时操作。也需要放在子线程
        // 如果回调block里面只需要更新UI,那么就可以只开始指定queue为主队列

        Handler:网络访问完成以后执行的代码块
        response: 服务器的响应(包含响应行/响应头...下载的时候才去关心这个)
        data: 返回的二进制数据
        connectionError:在连接服务器的时候的错误,只要是能正常连接到服务器,就不会有错。
        只要有网络候出现的错访问,就会可能有错误
        */
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { [weak self] (response:NSURLResponse?, data:NSData?, error:NSError?) -> Void in
            self?.webView.loadHTMLString(String(data: data!, encoding: NSUTF8StringEncoding)!, baseURL: nil)
        }
    }
    // NSURLSession发送请求
    func requestB()
    {
        // 确定url
        let url = NSURL(string: "https://m.baidu.com")
        // 设置请求
        let request = NSURLRequest(URL: url!)
        // 发送请求,NSURLConnection会出警告,所以使用NSURLSession
        let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
        let task = session.dataTaskWithRequest(request) { [weak self] (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in
            dispatch_async(dispatch_get_main_queue(), { [weak self] () -> Void in
                self!.webView.loadHTMLString(String(data: data!, encoding: NSUTF8StringEncoding)!, baseURL: nil)
            })
        }
        task.resume()
    }
}