iOS网络编程————POST请求和GET请求

iOS的网络编程主要涉及两者:客户端和服务器端,上传和下载数据都是客户端通过访问服务器端来实现的。

服务器端开发语言有Java,.Net,C/C++,PHP,Ruby,Python等,而手机客户端的开发语言有OC,Java等与后端开发语言不同,因此要实现服务器端与客户端的数据传输必然要有约定一种数据传输的格式和传输协议,否则二者不能进行交流。这个格式可以为JSON,XML等,传输协议我们熟知的有http(超文本传输协议),它是一个通信规则,注意:这个协议永远都是客户端发起请求,服务器端回送响应。

HTTP请求包:客户端发送一个HTTP请求,是向服务器提交了一个HTTP请求包。

请求包的结构:请求头和请求体。

请求体的数据格式:JSON、XML、符号拼接,客户端向服务器提交的数据都放在请求体中或者后面的URL中。

HTTP请求包包括GET请求和POST请求:

GET请求是客户端向服务器索取数据的一种请求方式,(只包含请求头)。

POST请求是客户端向服务器提交数据的方式,(包含请求头和请求体)。

HTTP响应包:服务器收到请求之后向客户端回应了一个HTTP响应包。

响应包结构:响应头和响应体。

服务器通过响应体将数据传给客户端,数据格式有JSON、XML。

同步请求:数据的请求过程在主线程执行的,网络数据传输的过程会导致主线程堵塞。

异步请求:数据的请求过程在多线程执行的,保持主线程的流畅性,UI界面的渲染与刷新在主线程中,主线程不流畅会导致UI界面卡顿。

下面来点干货

网络组件:NSURLSession可以实现上传,下载,处理认证等工具,能处理http协议中的所用事情。

NSURLSession由NSURLSessionConfiguration和可选代理(optional delegate)构成。再根据你的网络需求通过NSURLSessionTask来创建session。


GET请求:

#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UITextView *textView;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

}

- (IBAction)GET:(id)sender {

/*

使用NSURLSession 进行网络请求的几个步骤

1.构造NSURL地址

2.构造请求对象 NSURLRequest

3.构造NSURLSessionConfiguration配置文件,可选

4.构造NSURLSession网络会话对象

5.创建网络任务

6.执行网络任务,发送网络请求

*/

//1

NSURL *url= [NSURL URLWithString:@"http://piao.163.com/m/cinema/list.html?app_id=1&mobileType=iPhone&ver=2.6&channel=appstore&deviceId=9E89CB6D-A62F-438C-8010-19278D46A8A6&apiVer=6&city=110000"];

//2 使用URL 创建一个可变的请求对象

NSMutableURLRequest *request= [NSMutableURLRequest requestWithURL:url];

//设置请求对象

//请求方式

request.HTTPMethod= @"GET";

//超时时间

request.timeoutInterval=60;

//设置请求头中的参数

// [request setValue:@"1533" forHTTPHeaderField:@"cinema_id"];

//3 创建会话对象  默认的会话

NSURLSession *session= [NSURLSession sharedSession];

//4 创建网络任务

//NSURLSessionTask 抽象类  使用其子类 dataTask,uploadTask,downloadTask

NSURLSessionDataTask *dataTask= [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

//判断错误

if (error) {

NSLog(@"请求出错:%@", error);

return;

}

NSError *jsonError=nil;

//Json解析

NSDictionary *dic= [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jsonError];

NSString *jsonText= [NSString stringWithFormat:@"%@", dic];

//回到主线程 来刷新文字

[_textView performSelectorOnMainThread:@selector(setText:) withObject:jsonText waitUntilDone:NO];

}];

//5 开启任务

[dataTask resume];

}



POST请求:

#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UITextView *textView;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

}

- (IBAction)POST:(id)sender {

/*

使用NSURLSession 进行网络请求的几个步骤

1.构造NSURL地址

2.构造请求对象 NSURLRequest

3.构造NSURLSessionConfiguration配置文件,可选

4.构造NSURLSession网络会话对象

5.创建网络任务

6.执行网络任务,发送网络请求

*/

NSURL *url= [NSURL URLWithString:@"http://piao.163.com/m/cinema/schedule.html?app_id=1&mobileType=iPhone&ver=2.6&channel=appstore&deviceId=9E89CB6D-A62F-438C-8010-19278D46A8A6&apiVer=6&city=110000"];

NSMutableURLRequest *request= [NSMutableURLRequest requestWithURL:url];

//设置POST请求

request.HTTPMethod= @"POST";

request.timeoutInterval=60;

//设置请求体

//cinema_id=1533

NSData *bodyData= [@"cinema_id=1533" dataUsingEncoding:NSUTF8StringEncoding];

request.HTTPBody=bodyData;

NSURLSession *session= [NSURLSession sharedSession];

NSURLSessionDataTask *dataTask= [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

NSDictionary *dic= [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

NSString *jsonString= [NSString stringWithFormat:@"%@", dic];

[_textView performSelectorOnMainThread:@selector(setText:) withObject:jsonString waitUntilDone:NO];

//获取响应包

//将response 转化为一个子类的HTTPURLResponse

NSHTTPURLResponse *httpResponse= (NSHTTPURLResponse *)response;

//打印状态码

NSLog(@"状态码:%li", httpResponse.statusCode);

//获取响应头

NSDictionary *responseHeader=httpResponse.allHeaderFields;

NSLog(@"响应头:%@", responseHeader);

}];

//开始网络任务

[dataTask resume];

}



NSURLSessionConfiguration配置网络会话

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

//使用NSURLSessionConfiguration 来配置网络会话

/*

1 构造URL地址

2 创建Request对象(可选)

3 构建 NSURLSessionConfiguration 对象

4 通过配置 来构建网络会话

5 创建网络任务

6 开启任务

*/

_data= [NSMutableData data];

//URL

NSURL *url= [NSURL URLWithString:@"http://piao.163.com/m/cinema/list.html?app_id=1&mobileType=iPhone&ver=2.6&channel=appstore&deviceId=9E89CB6D-A62F-438C-8010-19278D46A8A6&apiVer=6&city=110000"];

//NSURLSessionConfiguration

/*

defaultSessionConfiguration;   默认的网络会话类型,会进行自动的缓存

ephemeralSessionConfiguration; 临时会话,不会进行任何缓存

backgroundSessionConfigurationWithIdentifier:(NSString *)identifier 后台会话,可以在程序进入到后台之后,继续网络任务

*/

NSURLSessionConfiguration *config= [NSURLSessionConfiguration defaultSessionConfiguration];

//config的常用设置

//config.requestCachePolicy 设置缓存策略

//config.networkServiceType 网络服务类型

config.timeoutIntervalForRequest=20; //网络超时时间

//config.HTTPAdditionalHeaders 请求头的设置

//config.discretionary 节能设置

config.allowsCellularAccess=YES; //是否使用蜂窝网络数据

//创建会话对象

//delegateQueue:用于指定代理方法所运行的队列

NSURLSession *session= [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];

//创建网络任务

NSURLSessionDataTask *task= [session dataTaskWithURL:url];

[task resume];

}

#pragma mark - NSURLSessionDataDelegate

//当一次网络请求开始,收到返回的响应头之后所调用的方法

- (void)URLSession:(NSURLSession *)session

dataTask:(NSURLSessionDataTask *)dataTask

didReceiveResponse:(NSURLResponse *)response

completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler {

NSLog(@"response: %@",response);

//将NSURLResponse的对象,强转成子类NSHTTPURLResponse对象

NSHTTPURLResponse *httpResponse= (NSHTTPURLResponse *)response;

NSLog(@"状态码:%li", httpResponse.statusCode);

//completionHandler 完成后的回调

//通过执行此bolck 来设定接下来网络访问

/*

NSURLSessionResponseCancel=0,       取消网络访问,不在读取响应体

NSURLSessionResponseAllow=1,        允许本次网络访问,继续接受数据

NSURLSessionResponseBecomeDownload=2, 转化为downLoadTask

NSURLSessionResponseBecomeStream

*/

completionHandler(NSURLSessionResponseAllow);

}

//响应体的接受

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {

//接收到响应体中的数据时  调用的方法

NSLog(@"data.lenght= %li", data.length);

//将每次接收到的数据,拼接到全局变量中

[_data appendData:data];

}

//响应完成

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {

if (error) {

NSLog(@"%@", error);

_data=nil;

} else {

//读取无误,Json解析

NSDictionary *dic= [NSJSONSerialization JSONObjectWithData:_data options:NSJSONReadingMutableContainers error:nil];

NSLog(@"dic= %@", dic);

}

}

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

推荐阅读更多精彩内容

  • iOS开发系列--网络开发 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博、微信等,这些应用本身可...
    lichengjin阅读 3,637评论 2 7
  • 218.241.181.202 wxhl60 123456 192.168.10.253 wxhl66 wxhl6...
    CYC666阅读 1,361评论 0 6
  • NSURLSession 使用步骤使用NSURLSession对象创建Task,然后执行Task -(void)g...
    BEYOND黄阅读 896评论 0 0
  • 目录 网络基本概念 TCP/IP协议簇基本概念 HTTP 网络开发技术解决方案 数据解析 网络优化 1. 网络基本...
    Ryan___阅读 1,347评论 1 0
  • 大家都知道: get是从服务器上获取数据,post是向服务器传送数据。前者把参数数据加在了将参数直接写在访问路径上...
    Littleredguy阅读 1,078评论 0 3