今天在公司開始着手做了一個項目,要和網絡接號對接的,有以下一點點小心得,上來分享一下:
首先說ios的網絡請求,方式有很多種,我把它分了兩種,一種是外框架型,一種是內框架;前都是應用了官方API以外的框架,后者則是相對;
-(void)testRequest
{
NSLog(@"test request...");
NSString *postUrl = @"url";
NSMutableDictionary *dlist = [[NSMutableDictionary alloc] init];
[dlist setObject:@"value" forKey:@"key"];
....
NSString *jsonStrPost = [self sendRequestTo:[NSURL URLWithString:postUrl] usingVerb:@"POST" withParameters:dlist];
NSLog(@"do post: jsonStrPost = %@", jsonStrPost);
}
上面用的就是有點像json的做法,ios的,呵!
下面再說另一種做法:
//quest
/**
* url:請求地址
* verb:請求方式
* parameters:請求參數
*/
-(NSString *)sendRequestTo:(NSURL *)url usingVerb:(NSString *)verb withParameters:(NSDictionary *)parameters{
NSString *jsonStr = nil;
NSData *body = nil;
NSMutableString *params = nil;
NSString *contentType = @"text/html; charset=utf-8";
NSURL *finalURL = url;
if(nil != parameters){
params = [[NSMutableString alloc] init];
for(id key in parameters){
NSString *encodedkey = [key stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
CFStringRef value = (__bridge CFStringRef)[[parameters objectForKey:key] copy];
CFStringRef encodedValue = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, value,NULL,(CFStringRef)@";/?:@&=+$", kCFStringEncodingUTF8);
[params appendFormat:@"%@=%@&", encodedkey, encodedValue];
CFRelease(value);
CFRelease(encodedValue);
}
[params deleteCharactersInRange:NSMakeRange([params length] - 1, 1)];
}
//
if([verb isEqualToString:@"POST"]){
contentType = @"application/x-www-form-urlencoded; charset=utf-8";
body = [params dataUsingEncoding:NSUTF8StringEncoding];
}else{
if(nil != parameters){
NSString *urlWithParams = [[url absoluteString] stringByAppendingFormat:@"?%@", params];
finalURL = [NSURL URLWithString:urlWithParams];
}
}
NSMutableDictionary *headers = [[NSMutableDictionary alloc] init];
[headers setValue:contentType forKey:@"Content-Type"];
[headers setValue:@"text/html" forKey:@"Accept"];
[headers setValue:@"no-cache" forKey:@"Cache-Control"];
[headers setValue:@"no-cache" forKey:@"Pragma"];
[headers setValue:@"close" forKey:@"Connection"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:finalURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
[request setHTTPMethod:verb];
[request setAllHTTPHeaderFields:headers];
if(nil != parameters){
[request setHTTPBody:body];
}
params = nil;
//
NSURLResponse *response;
NSError *error = nil;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if(error){
NSLog(@"something is wrong: %@", [error description]);
}else{
if(responseData){
jsonStr = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
}
}
return jsonStr;
}
NSString *jsonStrPost = [self sendRequestTo:[NSURL URLWithString:postUrl] usingVerb:@"POST" withParameters:dlist];
下面是第三種了~有什么疑問可以留言,偶會常看博客的了!
NSString *requestString = [NSString stringWithFormat:@"url"];
// 數據內容轉換為UTF8編碼,第二個參數為數據長度
// NSData *requestData = [NSData dataWithBytes:[requestString UTF8String] length:[requestString length]];
// 請求的URL地址
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:requestString]];
NSLog(@"%@\n",requestString);
// 設置請求方式
//[request setHTTPMethod:@"get"];
// 設置請求內容
//[request setHTTPBody:requestData];
// 設置請求頭聲明
[request setValue:@"text/xml" forHTTPHeaderField:@"Content-type"];
// 執行請求
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
// 輸出返回數據
NSString *returnString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@", returnString);
上面三種方法都有POST和GET兩種方式的其實他們也是差不多的,不過寫法不一樣而已
第四種用的是一個開源的框架,要導的包有點多,要注意了哦~
ASIFormDataRequest,或ASIHTTPRequest,這兩個東西不錯的哦,我這次的項目就是用這個東西做的
ASIFormDataRequest:
這個要引入的包有:(明天補上)
ASIFormDataRequest* req=[[ASIFormDataRequest alloc] init];
NSString* s_url=@"url";
req = [[ASIFormDataRequest alloc] initWithURL:[NSURL URLWithString:s_url]];
[req setRequestMethod:@"POST"];//@"GET""POST"
[req setDelegate:self];
[req setPostValue:value forKey:key];
.....
[req startAsynchronous];
結果返回時會自動調用以下方法
- (void)requestFinished:(ASIHTTPRequest *)request
{
int i = 0;
//亂碼的處理,呵
NSString * temp = [[[NSString alloc]initWithData:[request responseData] encoding:NSUTF8StringEncoding]autorelease];
NSArray * ttemp = [temp componentsSeparatedByString:@","];
}
ASIHTTPRequest
ASIHTTPRequest是簡單易用的,它封裝了CFNetwork API。使得與Web服務器通信變得更簡單。它是用Objective-C編寫的,可以在MAC OS X和iPhone應用中使用。
它適用於執行基本的HTTP請求和互動(或者說是反饋)。ASIFormDataRequest子類可以簡單的實現提交數據和文件。使用multipart/form-data
提供了以下:
一個從web服務器提交和獲取數據的接口
直接下載數據到內存或者本地文件系統里
能夠從本地提交文件,作為post數據的一部分。兼容HTML file input mechanism
可以訪問和修改http請求和響應header
獲得上傳下載的進度信息
異步請求和隊列,自動管理上傳下載隊列機制
cookie 支持
請求和響應的gzip支持
代理請求
ASIHTTPRequest設置
在iphone 項目中使用ASIHTTPRequest
1、添加一些必要的文件,復制以下文件到項目中去
ASIHTTPRquestConfig.h
ASInputStream.h
ASInputStream.m
ASIHTTPRequest.h
ASIHTTPRequest.h
ASINSStringAdditions.h
ASINSStringAdditions.m
ASIFormDataRequest.h
ASIFormDataRequest.m
ASINetworkQueue.h
ASINetworkQueue.m
iphone項目還必須包含以下文件
ASIAuthenticationDialog.h
ASIAuthenticationDialog.m
一個版本的Reachability類
添加必要的框架到項目中去
CFNetwork.framework
SystemConfiguration.framework
libz.1.2.3.dylib
配置Reachability
在iphone上,ASIHTTPRequest使用Apple的Reachability類。
Reachability有兩個版本,他們都能在ASIHTTPRequest發行文件的Reachability文件夾中找到。
2.0版本是最新的辦迸。如果你的項目是基於iphone os 3.x和更新的系統,你應該使用2.0版本的。包括.h和.m文件。保證在ASIHTTPRequestConfig.h文件中REACHABILITY_20_API的值為1
1.5是個老版本,它和iphone os 2.2.1-iphone os 3.0兼容。保證在ASIHTTPRequestConfig.h文件中REACHABILITY_20_API的值為0
在mac ox x項目中使用AHIHTTPRequest
為了在Mac os x項目中使用ASIHTTPRequest,你需要導入以下:
SystemConfiguration.framework + zlib
CoreService.framework
在Mac OS X上,CFNetwork 是CoreServices框架的一部分。除非你寫的是基於控制台的應用程序