ios网络请求
今天在公司開始著手做了一個項目,要和網絡接號對接的,有以下一點點小心得,上來分享一下:
首先說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框架的一部分。除非你寫的是基于控制臺的應用程序
轉載于:https://www.cnblogs.com/chiefCTO/archive/2012/03/30/2426103.html
總結
- 上一篇: div在最顶层显示----弹出框效果
- 下一篇: WinForm编程数据视图之DataGr