网络编程,主要的是向服务器发送请求,并且接受服务器的响应。以下是一般情况下的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