get和post请求方式

来源:互联网 发布:Java工程打包 编辑:程序博客网 时间:2024/05/20 15:38

get和post两种请求方式的比较:

1、给服务器传输数据的方式:
GET:通过网址字符串。
POST:通过data

2、传输数据的大小:
GET:网址字符串最多255字节。
POST:使用NSData,容量超过1G

3、安全性:GET:所有传输给服务器的数据,显示在网址⾥,类似于密码的明⽂输入,直接可见。
POST:数据被转成NSData(⼆进制数据),类似于密码的密⽂输入,无法直接读取。

同步连接:程序容易出现卡死现象(在主线程中操作), 请求完成之后, 才可进行其他操作. 弊端: 用户体验很差
异步连接:等待数据返回, 请求未完成时, 不影响程序任何操作(在子线程中操作), 用户体验好. 弊端: 相对同步来讲占用资源多(但是相对手机来讲基本可以忽略不计)

异步联接有两种实现⽅式:
设置代理,接收数据
实现block


下面介绍get的同步请求和异步请求

#define kGetURL @"http://api.map.baidu.com/place/v2/search?query=银行&region=上海&output=json&ak=6E823f587c95f0148c19993539b99295"@interface GetViewController () <NSURLConnectionDataDelegate>// 声明一个可变data, 用来拼接接收的数据@property (nonatomic, retain) NSMutableData *data;@end@implementation GetViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view.    [self setNavigationView];}

#pragma mark - Get同步按钮的实现- (void)actionLeftButton:(UIBarButtonItem *)leftButton {    // 1. 获取请求网址, 转换为NSURL对象    // 请求网址中包含中文时一定要转码, 需要转码后再进行请求, 否则会出现乱码    NSString *url = [kGetURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];    NSURL *newUrl = [NSURL URLWithString:url];       // 2. 创建一个请求 使用NSURLRequest类    // timeoutInterval:(NSTimeInterval): 设置请求失败的时间, 以秒为单位    // 设置成可变的url是为了之后设置请求方式, 若是get请求 可以直接用不可变, 因为默认是get请求 不用手动设置    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:newUrl cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10.0];       // 3. 设置请求方式, 默认是get请求,    [request setHTTPMethod:@"Get"];       // 4. 接收返回数据, 以二进制形式返回    // NSURLConnection---创建链接的, 通过这个链接返回数据    // 服务器返回的信息(是服务器信息)    NSURLResponse *response = nil;    // 请求失败的错误信息    NSError *error = nil;    // data是要用的信息    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];    // 进行解析, 展示数据    NSDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil];}

#pragma mark - Get异步按钮的实现- (void)actionRightButton:(UIBarButtonItem *)RightButton{    // 1. 获取网址, 如果有中文, 则需要转码, 转换成NSURL    NSString *url = [kGetURL stringByAddingPercentEscapesUsingEncoding:(NSUTF8StringEncoding)];    NSURL *newUrl = [NSURL URLWithString:url];       // 2. 创建一个请求, NSURLRequest类    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:newUrl cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10.0];       // 3. 设置请求方式    [request setHTTPMethod:@"Get"];       // 异步请求方法一: 利用代理方法:    // 设置代理: 需要指定一个请求, 了解是哪条请求异步链接    [NSURLConnection connectionWithRequest:request delegate:self];       // 异步请求方法二: block方法    [NSURLConnection sendAsynchronousRequest:request queue:([NSOperationQueue mainQueue]) completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {        // 回到主线程, 解析数据        // 如果你需要进度的话, 那么请你去使用方法1.        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil];        NSLog(@"%@", dic);    }];}

#pragma mark - get异步请求, 代理方法#pragma mark 已经接收到信息时触发 (刚一开始就触发, 只触发一次)- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {    // 初始化一个可变的data对象, 在其他方法中进行拼接    self.data = [NSMutableData data];    NSLog(@"response = %@  --------", response);}#pragma mark 开始接收到数据时触发 (多次触发, 每次返回一小部分数据)- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {    // 需要对NSDate进行拼接, 需要获取完整的数据    [self.data appendData:data];    NSLog(@"执行拼接呦~");}#pragma mark 数据接收完成(解析数据, 显示数据)- (void)connectionDidFinishLoading:(NSURLConnection *)connection {    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:self.data options:(NSJSONReadingMutableContainers) error:nil];}#pragma mark 请求失败或者请求中断时才会触发- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {}   


下面介绍Post的同步请求和异步请求

#define kPostURL @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx"#define kPostParam @"date=20131129&startRecord=1&len=30&udid=1234567890&terminalType=Iphone&cid=213"@interface PostViewController () <NSURLConnectionDataDelegate>@property (nonatomic, retain) NSMutableData *data;@end@implementation PostViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view.    [self setNavigationView];}

#pragma mark - Post同步按钮的实现- (void)actionLeftButton {       // 1. 获取网址    NSURL *url = [NSURL URLWithString:kPostURL];       // 2. 创建网络请求    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10.0];       // 3. 设置请求类型    [request setHTTPMethod:@"Post"];       // 4. 创建一个NSData的参数, 并转化成UTF-8编码格式    NSData *paramData = [kPostParam dataUsingEncoding:NSUTF8StringEncoding];       // 5. 携带参数 (可以携带多个参数, 但是并不常见)    [request setHTTPBody:paramData];       // 6. 创建链接并转化为data数据    NSURLResponse *response = nil;    NSError *error = nil;    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];    NSLog(@"%@", response);       // 7. 解析数据    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil];}

#pragma mark - Post异步按钮的实现- (void)actionRightButton {    NSURL *url = [NSURL URLWithString:kPostURL];    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10.0];    [request setHTTPMethod:@"Post"];    NSData *paramData = [kPostParam dataUsingEncoding:NSUTF8StringEncoding];    [request setHTTPBody:paramData];    // 使用代理方法解析    [NSURLConnection connectionWithRequest:request delegate:self];       // block    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {        NSDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil];    }];}

// 代理方法- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {    self.data = [NSMutableData data];}- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {    [self.data appendData:data];}- (void)connectionDidFinishLoading:(NSURLConnection *)connection {    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:self.data options:(NSJSONReadingMutableContainers) error:nil];}



0 0