同步GET:
// 1.将网址初始化成一个OC字符串对象 NSString *urlStr = [NSString stringWithFormat:@"%@?query=%@®ion=%@&output=json&ak=6E823f587c95f0148c19993539b99295", kBusinessInfoURL, @"银行", @"济南"]; // 如果网址中存在中文,进行URLEncode NSString *newUrlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; // 2.构建网络URL对象, NSURL NSURL *url = [NSURL URLWithString:newUrlStr]; // 3.创建网络请求 NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10]; // 创建同步链接 NSURLResponse *response = nil; NSError *error = nil; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
同步POST:
// 1.根据网址初始化OC字符串对象 NSString *urlStr = [NSString stringWithFormat:@"%@", kVideoURL]; // 2.创建NSURL对象 NSURL *url = [NSURL URLWithString:urlStr]; // 3.创建请求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // 4.创建参数字符串对象 NSString *parmStr = @"method=album.channel.get&appKey=myKey&format=json&channel=t&pageNo=1&pageSize=10"; // 5.将字符串转为NSData对象 NSData *pramData = [parmStr dataUsingEncoding:NSUTF8StringEncoding]; // 6.设置请求体 [request setHTTPBody:pramData]; // 7.设置请求方式 [request setHTTPMethod:@"POST"]; // 创建同步链接 NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
异步GET
NSString *urlStr = [NSString stringWithFormat:@"http://image.zcool.com.cn/56/13/1308200901454.jpg"]; NSString *newStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:newStr]; NSURLRequest *requst = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10]; //异步链接(形式1,较少用) [NSURLConnection sendAsynchronousRequest:requst queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { self.imageView.image = [UIImage imageWithData:data]; // 解析 NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; NSLog(@"%@", dic); }];
异步POST
// POST请求 NSString *urlString = [NSString stringWithFormat:@"%@",kVideoURL]; //创建url对象 NSURL *url = [NSURL URLWithString:urlString]; //创建请求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10]; //创建参数字符串对象 NSString *parmStr = [NSString stringWithFormat:@"method=album.channel.get&appKey=myKey&format=json&channel=t&pageNo=1&pageSize=10"]; //将字符串转换为NSData对象 NSData *data = [parmStr dataUsingEncoding:NSUTF8StringEncoding]; [request setHTTPBody:data]; [request setHTTPMethod:@"POST"]; //创建异步连接(形式二) [NSURLConnection connectionWithRequest:request delegate:self];
当创建异步连接时, 很少用到第一种方式,经常使用的是代理方法。关于NSURLConnectionDataDelegate,我们经常使用的协议方法为一下几个:
// 服务器接收到请求时 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { } // 当收到服务器返回的数据时触发, 返回的可能是资源片段 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { } // 当服务器返回所有数据时触发, 数据返回完毕 - (void)connectionDidFinishLoading:(NSURLConnection *)connection { } // 请求数据失败时触发 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"%s", __FUNCTION__); }
GET请求和POST请求的区别:
1. GET请求的接口会包含参数部分,参数会作为网址的一部分,服务器地址与参数之间通过 ? 来间隔。POST请求会将服务器地址与参数分开,请求接口中只有服务器地址,而参数会作为请求的一部分,提交后台服务器。
2. GET请求参数会出现在接口中,不安全。而POST请求相对安全。
3.虽然GET请求和POST请求都可以用来请求和提交数据,但是一般的GET多用于从后台请求数据,POST多用于向后台提交数据。
同步和异步的区别:
同步链接:主线程去请求数据,当数据请求完毕之前,其他线程一律不响应,会造成程序就假死现象。
异步链接:会单独开一个线程去处理网络请求,主线程依然处于可交互状态,程序运行流畅。
//话外;以下为转载:
在 iOS 程序访问 HTTP 资源时需要对 URL 进行 Encode,比如像拼出来的 http://unmi.cc?p1=%+&sd f&p2=中文,其中的中文、特殊符号&%和空格都必须进行转译才能正确访问。
在 Java、.net 和 JS 中都有相应的 encodeURL 方法可用,在 Objective-C 语言中,你可以试下
- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)enc;
来对完整的 URL(带请求参数的)进行编码,比如执行下面的代码:
NSString *url=@"http://unmi.cc?p1=%+&sd &p2=中文"; NSString *encodedValue = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
上面代码转换出的 encodedValue 是:
http://unmi.cc?p1=%+&sd &p2=中文
可见,它不会转换 URL 中的 ?%& 符号,这也正常,因为它肯定分不出哪个 & 是参数的连接符号还是参数值,你可以单独编码参数,然后在拼接成 URL 之前把属性参数值中的 ?%& 等符号分别替换成相应的编码。
或者,您还可以试下另外一个方法来单独编码参数值,然后拼接成完整的 URL:
CF_EXPORT
CFStringRef CFURLCreateStringByAddingPercentEscapes(CFAllocatorRef allocator, CFStringRef originalString, CFStringRef charactersToLeaved, CFStringRef legalURLCharactersToBeEscaped, CFStringEncoding encoding);
参考代码,分别编码前面的 p1=%+&sd f&p2=中文,两个参数的代码和结果如下:
NSString *param = @"%+&sd f"; NSString *encodedValue = (NSString*)CFURLCreateStringByAddingPercentEscapes(nil, (CFStringRef)param, nil, (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8);
这样编码出来的 encodedValue 为 %+&sd f,对 ?%& 等符号也会编码的。用上面的代码对 “中文” 进行编码的结果是:中文,与前面是一致的。
我实际应用时还是这个 CFURLCreateStringByAddingPercentEscapes 方法比较方便。
我们在项目中是使用的 ASIHTTPRequest 组件来访问 URL 的,在使用 ASIFormDataRequest 时发出它其中有一个方法:
- (NSString*)encodeURL:(NSString *)string { NSString *newString = NSMakeCollectable([(NSString *)CFURLCreateStringByAddingPercentEscapes( kCFAllocatorDefault, (CFStringRef)string, NULL, CFSTR(":/?#[]@!$ &'()*+,;="<>%{}|\\^~`"), CFStringConvertNSStringEncodingToEncoding([self stringEncoding])) autorelease]); if (newString) { return newString; } return @""; }
看起来它就是个 Objective-C 版的 encodeURL 方法,可是它声明成了一个实例方法,必须构造出 ASIFormDataRequest 实例才能使用它,在它的父类 ASIHTTPRequest 中都无该方法。现在来试验一下这个方法的返回值:
ASIFormDataRequest *formDataRequest = [ASIFormDataRequest requestWithURL:nil]; NSString *encodedValue1 = [formDataRequest encodeURL:@"%+&sd f"]; NSString *encodedValue2 = [formDataRequest encodeURL:@"中文"];
得出的 encodedValue1 和 encodedValue2 分别是 %+&sd f 和 中文,和前面是一致的,所以你可以用 ASIFormDataRequest 提供的方式来进行 URLEncode,把这个方法提出为一个工具方法即可。