网络编程,主要的是向服务器发送请求,并且接受服务器的响应。以下是一般情况下的httprequest的框架。
#import <Foundation/Foundation.h>
@protocol HTTPRequestDownDelegate <NSObject>
-(void)complateWithData:(NSData *)data;
-(void)failedWithError:(NSError *)error;
@end
@interface HttpRequest : NSObject<NSURLConnectionDataDelegate>
@property (nonatomic,assign) id<HTTPRequestDownDelegate> delegate;
-(void)downLoadFromURL:(NSString *)url;
-(NSData *)SynchronousDownloadFromURL:(NSString *)url error:(NSError **)error;
@end
以下是.m文件
#import "HttpRequest.h"
@interface HttpRequest ()
@property (nonatomic,retain) NSMutableData *data;
@end
@implementation HttpRequest
-(NSMutableData *)data
{
if (!_data) {
_data = [[NSMutableData alloc] init];
}
return _data;
}
//使用异步方式下载数据
-(void)downLoadFromURL:(NSString *)url
{
//编码URL中的中文和符号,可用
//[url stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
//方法进行解码
url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
//创建URL请求
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
//直接创建一个异步请求
[NSURLConnection connectionWithRequest:request delegate:self];
// [[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];等价
}
-(NSData *)SynchronousDownloadFromURL:(NSString *)url error:(NSError **)error
{
url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
NSHTTPURLResponse *response = nil;
return [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:error];
}
//当链接收到回复时调用该方法
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
//对于http请求,成功的返回码为200,还有其他的各类返回码,如404代表页面不存在,500代表服务器错误等等,可以参考其他具体的文档
if (httpResponse.statusCode != 200 ) {
//do something
}
}
//如果连接失败,调用该方法
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"连接失败:%@",[error localizedDescription]);
if ([self.delegate respondsToSelector:@selector(failedWithError:)]) {
[self.delegate failedWithError:error];
}
}
//每当网络连接收到数据时都会调用此方法,并追加到已经储存的数据后边
//该方法会被循环调用
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
#if 0
static int count;
count++;
NSLog(@"接收数据:%@,第%d次",data,count);
#endif
[self.data appendData:data];
}
//当数据下载完成时调用该方法,将数据返回给调用者
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
//对于代理对象,最好的调用方式是有限判断能否相应要调用的方法
//这种方式可以有效的防止unrecognized selector错误导致程序崩溃
//对于协议中的optional方法使用这种判断则尤为重要
if ([self.delegate respondsToSelector:@selector(complateWithData:)]) {
//回调请求数据的对象,将下载完成的数据传递回去
[self.delegate complateWithData:self.data];
//当把数据返回回去之后清空原数据,避免因为缓存造成数据混淆
self.data = nil;
}
}
@end