时间:2017年05月23日星期二
说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com
教学示例源码:无
个人学习源码:https://github.com/zccodere/s...
第一章:学习指南
1-1 学习指南
学习内容
HTTP简介
HTTP作用
获取一段网络数据:get请求
更新一段网络数据:post请求
使用UIWebView加载网页
总结
HTTP的起源
HTTP简介
HyperText Transfer Protocol,超文本传输协议
文本、图片、语音、视频
使用场景
打开百度网页是一个关于HTTP的网络请求
在手机App上登录操作是一个关于HTTP的网络请求
图片下载是一个关于HTTP的网络请求
HTTP角色
第二章:网络解析
2-1 网络请求解析
HTTP作用
HTTP是用来实现客户端与服务器之间进行信息通信的协议。
URL决定和谁通信。
URL结构
通信什么?
怎么通信?
多个客户端用不同的方式访问同一个服务器
HTTP提供了一个客户端与服务端通信的标准、规范
常见的请求方法
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
功能原型图
代码演示:
- (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 编辑用户信息
功能页面原型图
修改信息接口文档
请求地址: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的区别
常见的网络响应状态码
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使用
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。