网络编程(01)NSURLConnection

网络分层结构.png
http 通信流程.png

一 GET请求和POST请求的区别

  • GET请求和POST请求的区别主要是体现在数据的传递上.

  • GET请求相对于POST请求是不安全的

  • GET请求:
    在请求的URL后面一 '?'的形式跟上发给服务器的参数,多个参数之间以'&'隔开比如:

    http://www.baidu.com/login?usrName=zhangsan&pwd=123456&type=json
    

    由于浏览器和服务器对URL的长度有限制,因此在URL后面附带参数是由限制的,通常不超多1kb.

  • POST 请求
    发送个服务器的参数全部放在请求体
    理论上POST请求体传递的数据是没有限制的

二 HTTP请求过程----请求

HTTP 协议规定: 一个完整的由客户端发送给服务器的HTTP 请求中包含以下内容.

  • 请求头 包含了 对客户端的环境描述,客户端的请求信息等.
GET /xiaoming.png HTTP/1.1     // 包含了请求方法  请求路径  HTTP协议的版本
Host: 120.25.226.186:12345   // 客户端想访问服务器的主机地址
User-Agent: Mozilla/5.0          //客户端的类型,客户端的软件环境
Accept: text/html                    // 客户端所能接受的数据类型
Accept-Language: zh cn       //客户端语言环境
Accept-Encoding: gzip          //客户端支持的数据压缩格式 
  • 请求体: 客户端 发送给服务器的具体数据,比如文件数据. (请求体不是必须的,比如GET请求)

二 HTTP请求过程----相应

  • 客户端服务器 发送请求,服务器应当做出相应,即返数据给客户端
  • HTTP协议规定: 1个完整的相应体中应包含以下几个部分:
    响应头:包含对服务器的描述,对返回数据的描述
    HTTP/1.1 200 ok    //http 的版本  状态
    Server: Apache-Coyote/1.1  // 服务器的类型
    Content-Type: image/jpeg  // 返回数据的类型
    Content-Length: 56811   //返回数据的长度
    Date: Mon jun 2015 12:29:53 GMT  // 相应时间
    
    响应体 服务器返给客户端的具体数据,比如文件数据

三 HTTP请求状态码类别含义

类别 原因短语 解释 比如
1xx开头 信息性状态码 接收的请求正在处理
2xx开头 成功状态码 请求正常处理完毕 比如:200 表示成功
3xx开头 重定向状态码 要完成附加请求操作以完成请求
4xx开头 客户端错误 客户端错误 比如:404 请求路径错误,客户端传错了
5xx开头 服务端错误 服务端错误 比如:500 服务器出错

四 iOS中HTTP GET 请求

  • NSURLConnection 发送同步请求 GET
-(void)sendsync{
    
    // 1. 确定请求路径 (GET 请求: 基础路劲 + 参数)
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:12345/logo?usr=zhangsan&pwd=123456"];
    
    // 2. 创建请求对象 (该对象内部会默认 生成请求头), GET 请求没有请求体
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    // 3. 发送请求
    NSURLResponse *response = nil; // 响应头
    NSError *err = nil;
    // 4.返回请求的响应数据
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
    
    NSLog(@"data : %@",data);
}

  • NSURLConnection 发送异步请求 GET
- (void)sendAsync{
    
    // 1. 确定请求路径 (GET 请求: 基础路劲 + 参数)
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:12345/logo?usr=zhangsan&pwd=123456"];
    
    // 2. 创建请求对象 (该对象内部会默认 生成请求头), GET 请求没有请求体
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    // 3. 发送请求synchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { // 响应数据
        
        NSLog(@"response: %@, data: %@,connectionError : %@",response, data, connectionError);
    }];
}
  • NSURLConnection 发送请求 代理接收响应数据 GET
@interface TestViewController ()<NSURLConnectionDataDelegate>

@end

@implementation TestViewController

- (void)sendAsyncDelegate{
    
    // 1. 确定请求路径 (GET 请求: 基础路劲 + 参数)
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:12345/logo?usr=zhangsan&pwd=123456"];
    
    // 2. 创建请求对象 (该对象内部会默认 生成请求头), GET 请求没有请求体
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    // 3. 发送请求
    [[NSURLConnection alloc] initWithRequest:request delegate:self];

    //startImmediately:NO 时,不会立即发送请求需要手动调用start 发送请求
    //NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
    //[connection start];
}


#pragma mark- NSURLConnectionDataDelegate
// 1 接收到相应头调用
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{

}

//2.接收到数据调用, 该方法可能被调用多次
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    
}
// 3. 完成后调用
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    
}

//4. 失败时调用
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    
}

五 iOS中HTTP POST 请求

- (void)sendAsyncPOST{
    
    // 1. 确定请求路径 (GET 请求: 基础路劲 + 参数)
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:12345/logo"];
    
    // 2. 创建请求对象 (该对象内部会默认 生成请求头)
    NSMutableURLRequest  *request = [NSMutableURLRequest requestWithURL:url];
    // 2.1如果请求头的信息不满足可以自己修改
    [request setValue:@"ios 10.2" forHTTPHeaderField:@"User-Agent"];
    // 2.2设置请求超时时间
    request.timeoutInterval = 15;
    
    //3.设置请求方式
    request.HTTPMethod = @"POST";
    //4.设置请求体
    request.HTTPBody = [@"usr=zhangsan&pwd=123456" dataUsingEncoding:NSUTF8StringEncoding];
    
    
    // 3. 发送请求
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        // 处理相应信息
    }];
    
}

五 URL转码

在使用URL的时候,如果字符串中设计到中文,那么需要对中文进行转码

NSString *urlStr = @"http://120.25.226.186:12345/logo?usr=张三&pwd=12345"; 
NSURL *url = [NSURL URLWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,654评论 18 139
  • 深入浅出HTTP协议(WEB开发和面试必备) 1.基础概念篇 a.简介 HTTP是Hyper Text Trans...
    半世韶华忆阑珊阅读 1,221评论 0 7
  • 本文整理自MIN飞翔博客 [1] 1. 概念 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或...
    HoyaWhite阅读 2,671评论 2 20
  • 一、概念(载录于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434阅读 8,353评论 6 152
  • 小周被女友甩了。他们是异地恋。从大一开始一见钟情,四年之后,两个人在不同的城市工作打拼。起初,两个人仍然相爱,爱得...
    白衣梧桐阅读 1,717评论 0 0