一、网络基础
1.网络基础
001 问题:为什么要学习网络编程?
回答:(1)网络编程是一种实时更新应用数据的常用手段
(2)网络编程是开发优秀网络应用的前提和基础
002 网络基本概念
2-1 客户端(就是手机或者ipad等手持设备上面的APP)
2-2 服务器(远程服务器-本地服务器)
2-3 请求(客户端索要数据的方式)
2-4 响应(需要客户端解析数据)
2-5 数据库(服务器的数据从哪里来)
2.Http
001 URL
1-1 如何找到服务器(通过一个唯一的URL)
1-2 URL介绍
a. 统一资源定位符
b. url格式(协议\主机地址\路径)
协议:不同的协议,代表着不同的资源查找方式、资源传输方式
主机地址:存放资源的主机(服务器)的IP地址(域名)
路径:资源在主机(服务器)中的具体位置
1-3 请求协议
【file】访问的是本地计算机上的资源,格式是file://(不用加主机地址)
【ftp】访问的是共享主机的文件资源,格式是ftp://
【mailto】访问的是电子邮件地址,格式是mailto:
【http】超文本传输协议,访问的是远程的网络资源,格式是http://(网络请求中最常用的协议)
002 http协议
2-1 http协议简单介绍
a.超文本传输协议
b.规定客户端和服务器之间的数据传输格式
c.让客户端和服务器能有效地进行数据沟通
2-2 http协议优缺点
a.简单快速(协议简单,服务器端程序规模小,通信速度快)
b.灵活(允许传输各种数据)
c.非持续性连接(1.1之前版本是非持续的,即限制每次连接只处理一个请求,
服务器对客户端的请求做出响应后,马上断开连接,这种方式可以节省传输时间)
2-3 基本通信过程
a.请求:客户端向服务器索要数据
b.响应:服务器返回客户端相应的数据
003 GET和POST请求
3-1 http里面发送请求的方法
GET(常用)、POST(常用)、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH
3-2 GET和POST请求的对比【区别在于参数如何传递】
GET
在请求URL后面以?的形式跟上发给服务器的参数,多个参数之间用&隔开,比如
http://ww.test.com/login?username=123&pwd=234&type=JSON
由于浏览器和服务器对URL长度有限制,因此在URL后面附带的参数是有限制的,通常不能超过1KB
POST
发给服务器的参数全部放在请求体中
理论上,POST传递的数据量没有限制(具体还得看服务器的处理能力)
3-3 如何选择【除简单数据查询外,其它的一律使用POST请求】
a.如果要传递大量数据,比如文件上传,只能用POST请求
b.GET的安全性比POST要差些,如果包含机密\敏感信息,建议用POST
c.如果仅仅是索取数据(数据查询),建议使用GET
d.如果是增加、修改、删除数据,建议使用POST
004 iOS中发送http请求的方案
4-1 苹果原生
NSURLConnection 03年推出的古老技术
NSURLSession 13年推出iOS7之后,以取代NSURLConnection【重点】
CFNetwork 底层技术、C语言的
4-2 第三方框架
ASIHttpRequest
AFNetworking 【重点】
MKNetworkKit
005 http请求通信过程
5-1 请求
【包括请求头+请求体·非必选】
5-2 响应
【响应头+响应体】
5-3 通信过程
a.发送请求的时候把请求头和请求体(请求体是非必须的)包装成一个请求对象
b.服务器端对请求进行响应,在响应信息中包含响应头和响应体,响应信息是对服务器端的描述,
具体的信息放在响应体中传递给客户端
5-4 状态码
【200】:请求成功
【400】:客户端请求的语法错误,服务器无法解析
【404】:无法找到资源
【500】:服务器内部错误,无法完成请求
3.Https
1.https简单说明
1) HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),
是以安全为目标的HTTP通道,简单讲是HTTP的安全版。
2) 即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。
3) https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。
2.HTTPS和HTTP的区别主要为以下四点:
1) https协议需要到ca申请证书,一般免费证书很少,需要交费。
2) http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
3) http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4) http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
3.简单说明
1) HTTPS的主要思想是在不安全的网络上创建一安全信道,并可在使用适当的加密包和服务器证书可被验证且可被信任时,
对窃听和中间人攻击提供合理的保护。
2)HTTPS的信任继承基于预先安装在浏览器中的证书颁发机构(如VeriSign、Microsoft等)
(意即“我信任证书颁发机构告诉我应该信任的”)。
3)因此,一个到某网站的HTTPS连接可被信任,如果服务器搭建自己的https 也就是说采用自认证的方式来建立https信道,
这样一般在客户端是不被信任的。
4)所以我们一般在浏览器访问一些https站点的时候会有一个提示,问你是否继续。
4.对开发的影响。
4.1 如果是自己使用NSURLSession来封装网络请求,涉及代码如下。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]
delegate:self
delegateQueue:[NSOperationQueue mainQueue]];
NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:@"https://www.apple.com"]
completionHandler:^(NSData *data,
NSURLResponse *response,
NSError *error) {
NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}];
[task resume];
}
/*
只要请求的地址是HTTPS的, 就会调用这个代理方法
我们需要在该方法中告诉系统, 是否信任服务器返回的证书
Challenge: 挑战 质问 (包含了受保护的区域)
protectionSpace : 受保护区域
NSURLAuthenticationMethodServerTrust : 证书的类型是 服务器信任
*/
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition,
NSURLCredential *))completionHandler
{
// NSLog(@"didReceiveChallenge %@", challenge.protectionSpace);
NSLog(@"调用了最外层");
// 1.判断服务器返回的证书类型, 是否是服务器信任
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
NSLog(@"调用了里面这一层是服务器信任的证书");
/*
NSURLSessionAuthChallengeUseCredential = 0, 使用证书
NSURLSessionAuthChallengePerformDefaultHandling = 1, 忽略证书(默认的处理方式)
NSURLSessionAuthChallengeCancelAuthenticationChallenge = 2, 忽略书证, 并取消这次请求
NSURLSessionAuthChallengeRejectProtectionSpace = 3, 拒绝当前这一次, 下一次再询问
*/
// NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
NSURLCredential *card = [[NSURLCredential alloc]initWithTrust:challenge.protectionSpace.serverTrust];
completionHandler(NSURLSessionAuthChallengeUseCredential , card);
}
}
4.2 如果是使用AFN框架,那么我们不需要做任何额外的操作,AFN内部已经做了处理。
4 URL中文转码问题
//1.确定请求路径
NSString *urlStr = @"http://120.25.226.186:32812/login2?username=哈哈哈&pwd=123";
NSLog(@"%@",urlStr);
//中文转码操作
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@",urlStr);
NSURL *url = [NSURL URLWithString:urlStr];