时间:2017年05月23日星期二
说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com
教学示例源码:无
个人学习源码:https://github.com/zccodere/s...

第一章:学习指南

1-1 学习指南

学习内容

HTTP简介
HTTP作用
获取一段网络数据:get请求
更新一段网络数据:post请求
使用UIWebView加载网页
总结

HTTP的起源

clipboard.png

clipboard.png
HTTP简介

HyperText Transfer Protocol,超文本传输协议
文本、图片、语音、视频

使用场景

打开百度网页是一个关于HTTP的网络请求
在手机App上登录操作是一个关于HTTP的网络请求
图片下载是一个关于HTTP的网络请求

HTTP角色

clipboard.png

第二章:网络解析

2-1 网络请求解析

HTTP作用

HTTP是用来实现客户端与服务器之间进行信息通信的协议。
URL决定和谁通信。

URL结构

clipboard.png

通信什么?

clipboard.png

怎么通信?

多个客户端用不同的方式访问同一个服务器
HTTP提供了一个客户端与服务端通信的标准、规范

常见的请求方法

clipboard.png

iOS中的网络请求

NSURL:用来表示客服端访问哪台服务器上的指定资源
NSURLRequest:用来表示客户端发起的网络请求内容
NSURLConnection:用来表示客户端与服务器之间建立的网络连接【已过时】
NSURLResponse:用来表示服务端给予客户端请求的响应结果

2-2 发送第一个网络请求

多起安全事件的影响

苹果“XcodeGhost”事件曝光
多位名人的艳照曝光
iOS9中新增App Transport Security(简称ATS)特性
强制使用HTTPS,提升安全级别

为了方便版本迭代,提供了一个键值来设置,正常使用HTTP。在Info.plist文件中添加以下配置。

代码演示:

1.配置允许http请求

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

2.http请求代码

// NSURLConnection 类已经过时,使用替代类 NSURLSession
    
// 表示访问的服务器
NSURL *url = [NSURL URLWithString:@"http://www.imooc.com"];

// 表示客户端发起的网络请求的请求内容
//NSURLRequest *request = [NSURLRequest requestWithURL:url];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

request.HTTPMethod = @"GET";

// 获得会话对象
NSURLSession *session = [NSURLSession sharedSession];

// 根据会话对象,创建一个Task任务
NSURLSessionTask *sessionDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data,NSURLResponse * _Nullable response, NSError * _Nullable error){
    
    // 解析响应数据
    NSLog(@"从服务器获取到数据,响应消息:%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);

}];

// 执行任务
[sessionDataTask resume];

第三章:使用Get方式发送请求

3-1 搭建用户信息界面

获取网络数据

从网络上获取个人用户信息,解析数据将其展示在页面上

获取信息接口文档

请求地址:http://127.0.0.1:12580/WebServer/docPath
请求方式:GET
请求参数:
    参数名称 类型 是否必须 说明
    userId int yes
响应参数:
    参数名称 类型 说明
    bstatus jsonObj 响应结果消息
    bstatus.code int 状态码
    bstatuc.des String 状态描述
    userInfo jsonObj 用户信息
    userInfo.userName String 用户名
    userInfo.userSex int 性别:0,、男;1、女
    userInfo.birthday String 生日,“05-23”
    userInfo.email String 邮箱,2539943892@qq.com
    userInfo.phone String 手机号,135****8142

功能原型图

clipboard.png

代码演示:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    // 设置父View背景颜色
    [self.view setBackgroundColor:[UIColor whiteColor]];
    
    // 创建标题控件
    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 40, kScreenWidth, 20)];
    [titleLabel setText:@"个人用户信息"];
    titleLabel.textAlignment = NSTextAlignmentCenter;
    titleLabel.font = [UIFont systemFontOfSize:18];
    titleLabel.backgroundColor = [UIColor clearColor];
    [self.view addSubview:titleLabel];
    
    // 创建用户名控件
    _userNameView = [[KeyValueView alloc] initWithFrame:CGRectMake(100, 70, kScreenWidth - 100 *2 , 30)];
    _userNameView.backgroundColor = [UIColor clearColor];
    [self.view addSubview:_userNameView];
    
    // 创建用户性别控件
    _userSexView = [[KeyValueView alloc] initWithFrame:CGRectMake(100, 70 + 30, kScreenWidth - 100 *2 , 30)];
    _userSexView.backgroundColor = [UIColor clearColor];
    [self.view addSubview:_userSexView];
    
    // 创建用户生日控件
    _userBirthdayView = [[KeyValueView alloc] initWithFrame:CGRectMake(100, 70 + 30 * 2, kScreenWidth - 100 *2 , 30)];
    _userBirthdayView.backgroundColor = [UIColor clearColor];
    [self.view addSubview:_userBirthdayView];
    
    // 创建用户邮箱控件
    _userEmailView = [[KeyValueView alloc] initWithFrame:CGRectMake(100, 70 + 30 * 3, kScreenWidth - 100 *2 , 30)];
    _userEmailView.backgroundColor = [UIColor clearColor];
    [self.view addSubview:_userEmailView];
    
    // 创建用户手机控件
//    _userPhoneView = [[KeyValueView alloc] initWithFrame:CGRectMake(100, 70 + 30 * 4, kScreenWidth - 100 *2 , 30)];
//    _userPhoneView.backgroundColor = [UIColor clearColor];
//    [self.view addSubview:_userPhoneView];
    
    _phoneLable = [[UILabel alloc] initWithFrame:CGRectMake(100, 70 + 30 * 4, (kScreenWidth -100*2)/3, 30)];
    _phoneLable.backgroundColor = [UIColor clearColor];
    _phoneLable.textAlignment = NSTextAlignmentLeft;
    _phoneLable.font = [UIFont systemFontOfSize:16];
    _phoneLable.textColor = [UIColor blackColor];
    [self.view addSubview:_phoneLable];
    
    // 创建可编辑用户手机号控件
    _phoneTextFiled = [[UITextField alloc] initWithFrame:CGRectMake(100+(kScreenWidth -100*2)/3, 70 + 30 * 4, kScreenWidth - 100 *2, 30)];
    _phoneTextFiled.backgroundColor = [UIColor clearColor];
    _phoneTextFiled.textAlignment = NSTextAlignmentLeft;
    _phoneTextFiled.font = [UIFont systemFontOfSize:16];
    _phoneTextFiled.textColor = [UIColor blackColor];
    // 设置键盘格式 数字键盘
    _phoneTextFiled.keyboardType = UIKeyboardTypeNumberPad;
    [self.view addSubview:_phoneTextFiled];
    
    // 请求按钮控件
    UIButton *getUserInfoButton = [[UIButton alloc] initWithFrame:CGRectMake(100, 70 + 30 * 5, kScreenWidth - 100*2, 30)];
    getUserInfoButton.backgroundColor = [UIColor redColor];
    [getUserInfoButton setTitle:@"获取信息" forState:UIControlStateNormal];
    [getUserInfoButton setTintColor:[UIColor whiteColor]];
    // 添加事件
    [getUserInfoButton addTarget:self action:@selector(loadGetWebRequest:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:getUserInfoButton];
    
    // 保存按钮控件
    UIButton *saveUserInfoButton = [[UIButton alloc] initWithFrame:CGRectMake(100, 70 + 30 * 7, kScreenWidth - 100*2, 30)];
    saveUserInfoButton.backgroundColor = [UIColor redColor];
    [saveUserInfoButton setTitle:@"保存信息" forState:UIControlStateNormal];
    [saveUserInfoButton setTintColor:[UIColor whiteColor]];
    // 添加事件
    [saveUserInfoButton addTarget:self action:@selector(loadPostWebRequest:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:saveUserInfoButton];
    
    
}

3-2 发起网络请求获取数据

代码演示:

// 发起GET请求并解析响应数据
-(void)loadGetWebRequest:(id)sender{
    // 指明访问的服务器地址
    NSURL *url = [NSURL URLWithString:@"http://115.159.205.199:12580/WebServer/user/1"];
    // 创建请求对象 NSURLRequest默认请求方式为GET
    //NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    // 设置请求方式
    [request setHTTPMethod:@"GET"];
    
    // 获得会话对象
    NSURLSession *session = [NSURLSession sharedSession];
    // 根据会话对象,创建一个Task任务
    NSURLSessionTask *sessionDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data,NSURLResponse * _Nullable response, NSError * _Nullable error){
        
        // 解析响应数据
        //NSLog(@"从服务器获取到数据,响应消息:%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
        
        // 解析JOSN数据
        id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        //NSLog(@"从服务器获取到数据,响应消息:%@",obj);
        // 如果obj是 字典类型
        if([obj isKindOfClass:[NSDictionary class]]){
            NSDictionary *userInfo = [(NSDictionary *)obj objectForKey:@"userInfo"];
            
            NSString *userName = [userInfo objectForKey:@"userName"];
            [_userNameView setupKey:@"姓名" value:userName];
            NSLog(@"userName = %@",userName);
            
            NSString *userSex = [NSString stringWithFormat:@"%@",[userInfo objectForKey:@"userSex"]];
            if([userSex isEqualToString: @"1"]){
                userSex = @"女";
            }
            if([userSex isEqualToString: @"0"]){
                userSex = @"男";
            }
            [_userSexView setupKey:@"性别" value:userSex];
            NSLog(@"userSex = %@",userSex);
            
            NSString *userBirthday = [userInfo objectForKey:@"userBirthday"];
            [_userBirthdayView setupKey:@"生日" value:userBirthday];
            NSLog(@"userBirthday = %@",userBirthday);
            
            
            NSString *userEmail = [userInfo objectForKey:@"userEmail"];
            [_userEmailView setupKey:@"邮箱" value:userEmail];
            NSLog(@"userEmail = %@",userEmail);
            
            NSString *userPhone = [userInfo objectForKey:@"userPhone"];
//            [_userPhoneView setupKey:@"手机" value:userPhone];
            [_phoneLable setText:@"手机"];
            [_phoneTextFiled setText:userPhone];
            NSLog(@"userPhone = %@",userPhone);
            
            
        }
        
    }];
    
    // 执行任务
    [sessionDataTask resume];
}

第四章:使用Post方式发送请求

4-1 编辑用户信息

功能页面原型图

clipboard.png

修改信息接口文档

请求地址:http://127.0.0.1:12580/WebServer/docPath
请求方式:POST
请求参数:
    参数名称 类型 是否必须 说明
    userId int yes
    phone String no
    email String no
响应参数:
    参数名称 类型 说明
    bstatus jsonObj 响应结果消息
    bstatus.code int 状态码
    bstatuc.des String 状态描述

4-2 使用Post请求修改数据

代码演示:

// 发起POST请求并解析响应数据
-(void)loadPostWebRequest:(id)sender{
    
    // 不需要将网络请求参数拼接到url后面
    NSURL *url = [NSURL URLWithString:@"http://115.159.205.199:12580/WebServer/user/1"];
    
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    
    // 编辑后的手机号
    NSString *newPhone = [_phoneTextFiled text];
    
    // 封装请求参数
    NSString *postParam = [NSString stringWithFormat:@"phone=%@",newPhone];
    NSData *postData = [postParam dataUsingEncoding:NSUTF8StringEncoding];
    // POST请求参数使用如下方法进行赋值
    [request setHTTPBody:postData];
    
    // 获得会话对象
    NSURLSession *session = [NSURLSession sharedSession];
    // 根据会话对象,创建一个Task任务
    NSURLSessionTask *sessionDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data,NSURLResponse * _Nullable response, NSError * _Nullable error){
        
        // 解析响应数据
        //NSLog(@"从服务器获取到数据,响应消息:%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
        
        // 解析JOSN数据
        id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        //NSLog(@"从服务器获取到数据,响应消息:%@",obj);
        // 如果obj是 字典类型
        if([obj isKindOfClass:[NSDictionary class]]){
            NSDictionary *bstatus = [(NSDictionary *)obj objectForKey:@"bstatus"];
            
            NSString *desc = [bstatus objectForKey:@"desc"];
            [_userNameView setupKey:@"描述" value:desc];
            NSLog(@"desc = %@",desc);
            
        }
    }];
    
    // 执行任务
    [sessionDataTask resume];

}

4-3 网络请求状态码

Get和Post的区别

clipboard.png

常见的网络响应状态码

clipboard.png

4-4 加载网页内容

代码演示:

//
//  ViewController.m
//  MyBrowser
//
//  Created by zc on 2017/6/2.
//  Copyright © 2017年 com.zccoder. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()<UISearchBarDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self.view setBackgroundColor:[UIColor colorWithRed:0.776 green:0.776 blue:0.8 alpha:1.0]];
    
    // 创建并初始化搜索框
    _searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(15, 34,self.view.frame.size.width - 15 * 2 -60, 44)];
    // 提示文字
    _searchBar.placeholder = @"http://www.baidu.com";
    _searchBar.backgroundColor = [UIColor clearColor];
    _searchBar.delegate = self;
    [self.view addSubview:_searchBar];
    
    // 创建并初始化搜索按钮
    _searchButton = [[UIButton alloc] initWithFrame:CGRectMake(_searchBar.frame.origin.x + _searchBar.frame.size.width + 10, 41, 60, 30)];
    _searchButton.backgroundColor = [UIColor clearColor];
    [_searchButton setTitle:@"搜索" forState:UIControlStateNormal];
    [_searchButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    _searchButton.layer.cornerRadius = 5.0;
    _searchButton.layer.borderColor = [UIColor blackColor].CGColor;
    _searchButton.layer.borderWidth = 1.0;
    // 添加事件
    [_searchButton addTarget:self action:@selector(searchAction:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:_searchButton];

    // 创建并初始化网页
    _webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 85, self.view.frame.size.width, self.view.frame.size.height - 85)];
    _webView.backgroundColor = [UIColor greenColor];
    [self.view addSubview:_webView];
    
}

// 搜索按钮点击事件
- (void)searchAction:(id)sender{
    NSLog(@"搜索按钮点击");
    [self loadWebContent];

}

// 接收点击键盘搜索按钮的回调
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
    NSLog(@"searchBarSearchButtonClicked");
    [self loadWebContent];

}

// 加载网页内容
- (void) loadWebContent{
    
    // 释放第一响应者,收起键盘
    [_searchBar resignFirstResponder];
    
    NSString *urlText = [_searchBar text];
    NSURL *url = [NSURL URLWithString:urlText];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSLog(@"正在加载:%@",urlText);
    [_webView loadRequest:request];

}

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


@end

第五章:总结

5-1 总结

总结

HTTP简介
HTTP作用
GET&POST请求
UIWebView使用

妙手空空
1.3k 声望368 粉丝

博观而约取,厚积而薄发