iOS网络编程

一、HTTP

a)               HTTP(Hyper Text TransferProtocol)超文本传输协议,是一种基于请求响应的无状态的应用层协议。其通过tcp协议进行传输。

b)              HTTP1.0 一次连接一次传输;HTTP1.1一次连接多次传输。

二、POST &GET

a)               GET 请求变量在url中,安全性能差,受url链接长度的限制传输数据少;

b)              POST 请求数据在包体中,相对安全,传输数据大。

三、请求方法

a)               同步get 主线程

b)              异步get

c)               同步post 主线程

d)              异步post

四、示例代码

//
//  ViewController.m
//  Demo18
//
//  Created by LiLeo on 16/6/24.
//  Copyright © 2016年 LeoLi. All rights reserved.
//

#import "ViewController.h"
#import "Reachability.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UILabel *status;

@property (strong, nonatomic) Reachability * reachability;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    _reachability = [Reachability reachabilityWithHostName:@"www.apple.com"];
    //[_reachability startNotifier];
}

- (void)viewWillAppear:(BOOL)animated {
    [_reachability startNotifier];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateNetworkStatus) name:kReachabilityChangedNotification object:nil];
}

- (void)viewDidDisappear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [_reachability stopNotifier];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

<span style="color:#ff0000;">/**
 * 同步get请求
 * 注意在Info.plist里添加
 * <key>NSAppTransportSecurity</key>
 *  <dict>
 *   <key>NSAllowsArbitraryLoads</key>
 *    <true/>
 * </dict>
 * App Transport Security Settings
 */</span>
- (IBAction)syncGet:(id)sender {
    //准备get请求连接
    NSString * string = [NSString stringWithFormat:@"%@", @"http://www.baidu.com"];
    //防止中文错误进行链接字符编码转换
    NSString * urlString = [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    //获取url
    NSURL * url = [NSURL URLWithString:urlString];
    //得到请求
    NSURLRequest * request = [NSURLRequest requestWithURL:url];
    //定义错误接收
    NSError * error;
    //发送同步get请求
    NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
    //数据转字符串
    NSString * result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    //输出的到的内容
    NSLog(@"%@", result);
}

- (IBAction)syncPost:(id)sender {
    //准备get请求连接
    NSString * string = [NSString stringWithFormat:@"%@", @"http://www.baidu.com"];
    //防止中文错误进行链接字符编码转换
    NSString * urlString = [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    //获取url
    NSURL * url = [NSURL URLWithString:urlString];
    //得到请求
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
    //准备http包体
    NSString * bodyString = @"page=1&line=10";
    //转换成数据
    NSData * bodyData = [bodyString dataUsingEncoding:NSUTF8StringEncoding];
    //设置包体和请求方法
    [request setHTTPBody:bodyData];
    [request setHTTPMethod:@"POST"];
    //定义错误接收
    NSError * error;
    //发送同步post请求
    NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];
    //数据转字符串
    NSString * result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    //输出的到的内容
    NSLog(@"%@", result);
}

- (IBAction)asyncGet:(id)sender {
    //准备get请求连接
    NSString * string = [NSString stringWithFormat:@"%@", @"http://www.baidu.com"];
    //防止中文错误进行链接字符编码转换
    NSString * urlString = [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    //获取url
    NSURL * url = [NSURL URLWithString:urlString];
    //得到请求
    NSURLRequest * request = [NSURLRequest requestWithURL:url];
    NSOperationQueue * queue = [[NSOperationQueue alloc] init];
    //发送同步get请求
    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        [NSThread sleepForTimeInterval:5];
        NSString * result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        //输出的到的内容
        NSLog(@"%@", result);
    }];
}

- (IBAction)asyncPost:(id)sender {
    //同上
    //使用新的api NSURLSession
    //NSURLSession 和 NSURLConnection的最大区别在于后台运行
    NSString * urlString = [NSString stringWithFormat:@"http://www.baidu.com"];
    NSString * safeUrlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"`#%^{}\"[]|\\<> "].invertedSet];
    NSURL * url = [NSURL URLWithString:safeUrlString];
    NSURLRequest * request = [NSURLRequest requestWithURL:url];
    NSURLSession * session = [NSURLSession sharedSession];
    /*NSURLSessionDataTask * task = */[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        [NSThread sleepForTimeInterval:5];
        NSString * result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        //输出的到的内容
        NSLog(@"%@", result);
    }];
}

- (void)updateNetworkStatus {
    NetworkStatus status = [_reachability currentReachabilityStatus];
    switch (status) {
        case NotReachable:
            _status.text = @"无网络";
            break;
        case ReachableViaWiFi:
            _status.text = @"WiFi网络";
            break;
        case ReachableViaWWAN:
            _status.text = @"WWAN网络";
            break;
            
        default:
            break;
    }
}

/**
 * 判断网络类型:无网 wifi 3g
 * NetworkStatus
 * typedef enum : NSInteger {
 *  NotReachable = 0,
 *	ReachableViaWiFi,
 *	ReachableViaWWAN
 * } NetworkStatus;
 */
- (BOOL)isNetworkAvaliable {
    Reachability * r = [Reachability reachabilityWithHostName:@"www.baidu.com"];
    NetworkStatus status = [r currentReachabilityStatus];
    if(status != NotReachable) {
        return YES;
    }
    return NO;
}

/**
 * 判断wifi通否
 */
- (BOOL)isWiFiAvaliable {
    Reachability * r = [Reachability reachabilityForLocalWiFi];
    NetworkStatus status = [r currentReachabilityStatus];
    if(status != NotReachable) {
        return YES;
    }
    return NO;
}

/**
 * 判断3g通否
 */
- (BOOL)isWWANAvaliable {
    Reachability * r = [Reachability reachabilityForInternetConnection];
    NetworkStatus status = [r currentReachabilityStatus];
    if(status != NotReachable) {
        return YES;
    }
    return NO;
}

@end



五、参考文档

a)               http://www.cocoachina.com/ios/20140919/9691.html

b)              http://witcheryne.iteye.com/blog/1879827

c)               http://www.tuicool.com/articles/VBv2qe

d)              http://www.aichengxu.com/view/82953

e)               http://www.open-open.com/lib/view/open1355055986679.html

 Reachability.h和Reachability.m文件下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柠檬李先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值