今天在公司开始着手做了一个项目,要和网络接号对接的,有以下一点点小心得,上来分享一下:

首先说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框架的一部分。除非你写的是基于控制台的应用程序


posted on 2012-03-30 22:04  Conerlius  阅读(6826)  评论(0编辑  收藏  举报