本文将带您了解关于IOS开发:ASIHTTPRequest中HTTP请求终结者详解的新内容,同时我们还将为您解释http请求结束的相关知识,另外,我们还将为您提供关于6.ASIHTTPRequest-
本文将带您了解关于IOS开发:ASIHTTPRequest中HTTP请求终结者详解的新内容,同时我们还将为您解释http请求结束的相关知识,另外,我们还将为您提供关于6. ASIHTTPRequest-HTTP授权-流程图、afnetworking 和 asihttprequest 强制修改 http 连接的 host 地址、ASIHTTPRequest iOS的HTTP开发包、ASIHTTPRequest —— iOS 的 HTTP 客户端开发包的实用信息。
本文目录一览:- IOS开发:ASIHTTPRequest中HTTP请求终结者详解(http请求结束)
- 6. ASIHTTPRequest-HTTP授权-流程图
- afnetworking 和 asihttprequest 强制修改 http 连接的 host 地址
- ASIHTTPRequest iOS的HTTP开发包
- ASIHTTPRequest —— iOS 的 HTTP 客户端开发包
IOS开发:ASIHTTPRequest中HTTP请求终结者详解(http请求结束)
IOS开发:ASIHTTPRequest中HTTP请求终结者详解
IOS开发中ASIHTTPRequest里HTTP请求终结者详解是本文要介绍的内容,主要是来学习IOS开发中请求同步的问题。今天把这个的官方文档翻译的出来以做分享,让迷途之人有路可寻.具体内容来考哪本文详细内容讲解。
ASIHTTPRequest是一款极其强劲的HTTP访问开源项目。让简单的API完成复杂的功能,
如:
异步请求,队列请求,GZIP压缩,缓存,断点续传,进度跟踪,上传文件,HTTP认证
在新的版本中,还加入了Objective-C闭包Block的支持,让我们的代码更加轻简灵活。
下面就举例说明它的API用法。
发起一个同步请求
同步意为着线程阻塞,在主线程中使用此方法会使应用Hang住而不响应任何用户事件。所以,在应用程序设计时,大多被用在专门的子线程增加用户体验,或用异步请求代替(下面会讲到)。
-(IBAction)grabURL:(id)sender
{
NSURL*url=[NSURLURLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest*request=[ASIHTTPRequestrequestWithURL:url];
[requeststartSynchronous];
NSError*error=[requesterror];
if(!error){
Nsstring*response=[requestresponseString];
}
}
(1)用requestWithURL快捷方法获取ASIHTTPRequest的一个实例
(2)startSynchronous 方法启动同步访问,
(3)由于是同步请求,没有基于事件的回调方法,所以从request的error属性获取错误信息。
(4)responseString,为请求的返回Nsstring信息。
创建一个异步请求
异步请求的好处是不阻塞当前线程,但相对于同步请求略为复杂,至少要添加两个回调方法来获取异步事件。
下面异步请求代码完成上面同样的一件事情:
-(IBAction)grabURLInBackground:(id)sender
{
NSURL*url=[NSURLURLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest*request=[ASIHTTPRequestrequestWithURL:url];
[requestsetDelegate:self];
[requeststartAsynchronous];
}
-(void)requestFinished:(ASIHTTPRequest*)request
{
//Usewhenfetchingtextdata
Nsstring*responseString=[requestresponseString];
//Usewhenfetchingbinarydata
NSData*responseData=[requestresponseData];
}
-(void)requestFailed:(ASIHTTPRequest*)request
{
NSError*error=[requesterror];
}
(1)与上面不同的地方是指定了一个 "delegate",并用startAsynchronous来启动网络请求。
(2)在这里实现了两个delegate的方法,当数据请求成功时会调用requestFinished,请求失败时(如网络问题或服务器内部错误)会调用requestFailed。
队列请求
提供了一个对异步请求更加精准丰富的控制。
如,可以设置在队列中,同步请求的连接数。往队列里添加的请求实例数大于maxConcurrentOperationCount时,请求实例将被置为等待,直到前面至少有一个请求完成并出列才被放到队列里执行。
也适用于当我们有多个请求需求按顺序执行的时候(可能是业务上的需要,也可能是软件上的调优),仅仅需要把maxConcurrentOperationCount设为“1”。
-(IBAction)grabURLInTheBackground:(id)sender
{
if(![selfqueue]){
[selfsetQueue:[[[NSOperationQueuealloc]init]autorelease]];
}
NSURL*url=[NSURLURLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest*request=[ASIHTTPRequestrequestWithURL:url];
[requestsetDelegate:self];
[requestsetDidFinishSelector:@selector(requestDone:)];
[requestsetDidFailSelector:@selector(requestWentWrong:)];
[[selfqueue]addOperation:request];//queueisanNSOperationQueue
}
-(void)requestDone:(ASIHTTPRequest*)request
{
Nsstring*response=[requestresponseString];
}
-(void)requestWentWrong:(ASIHTTPRequest*)request
{
NSError*error=[requesterror];
}
创建NSOperationQueue,这个Cocoa架构的执行任务(NSOperation)的任务队列。我们通过ASIHTTPRequest.h的源码可以看到,此类本身就是一个NSOperation的子类。也就是说它可以直接被放到"任务队列"中,并被执行。上面的代码队了队列的创建与添加操作外,其它代码与上一例一样。
队列异步请求中中获取或识别不同request小技巧
(1)可以设置一个上下文(userInfo)到request对象中,当请求响应完后可以通过访问request对象的userInfo获取里面的信息
(2)为每一个请求实例设置不同的setDidFinishSelector / setDidFailSelector的回调方法
(3)子类化ASIHTTPRequest,重写requestFinished: 与 failWithProblem:方法
ASINetworkQueues,它的delegate提供更为丰富的功能
提供的更多的回调方法如下:
(1)requestDidStartSelector,请求发起时会调此方法,你可以在此方法中跟据业务选择性的设置request对象的deleaget。
(2)requestDidReceiveResponseHeadeRSSelector,当接受完响应的Header后设计此方法,这个对下载大数据的时候相当有用,你可以在方法里做更多业务上的处理。
(3)requestDidFinishSelector,请求并响应成功完成时调用此方法
(4)requestDidFailSelector,请求失败
(5)queueDidFinishSelector,整个队列里的所有请求都结束时调用此方法。
它是NSOperationQueues的扩展,小而强大。但也与它的父类略有区别。如,仅添加到队列中其实并不能执行请求,只有调用[ queue g o ]才会执行;一个正在运行中的队列,并不需要重复调用[ queue go ]。
引用
<text">
默认情况下,队列中的一个请求如果失败,它会取消所有未完成的请求。可以设置[ queue setShouldCancelAllRequestsOnFailure:NO ]来修正。
取消异步请求
首先,同步请求是不能取消的。
其次,不管是队列请求,还是简单的异步请求,全部调用[ request cancel ]来取消请求。
引用
取消的请求默认都会按请求失败处理,并调用请求失败delegate。
如果不想调用delegate方法,则设置:[ request clearDelegatesAndCancel];
队列请求中需要注意的是,如果你取消了一个请求,队列会自动取消其它所有请求。
如果只想取消一个请求,可以设置队列:[ queue setShouldCancelAllRequestsOnFailure:NO ];
如果想明确取消所有请求:[ queue cancelAllOperations ];
安全的内存回收建议
request并没有retain你的delegate,所以在没有请求完的时候释放了此delegate,需要在dealloc方法里先取消所有请求,再释放请求实例,如:
-(void)dealloc
{
[requestclearDelegatesAndCancel];
[requestrelease];
...
[superdealloc];
}
向服务器端上传数据
ASIFormDataRequest ,模拟 Form表单提交,其提交格式与 Header会自动识别。
没有文件:application/x-www-form-urlencoded
有文件:multipart/form-data
ASIFormDataRequest*request=[ASIFormDataRequestrequestWithURL:url];
[requestsetPostValue:@"Ben"forKey:@"first_name"];
[requestsetPostValue:@"copsey"forKey:@"last_name"];
[requestsetFile:@"/Users/ben/Desktop/ben.jpg"forKey:@"photo"];
[requestaddData:imageDatawithFileName:@"george.jpg"andContentType:@"image/jpeg"forKey:@"photos"];
如果要发送自定义数据:
[requestresponseStatusCode];
[[requestresponseHeaders]objectForKey:@"X-Powered-By"];
[requestresponseEncoding];
下载文件
通过设置request的setDownloadDestinationPath,可以设置下载文件用的下载目标目录。
首先,下载过程文件会保存在temporaryFileDownloadpath目录下。如果下载完成会做以下事情:
1、如果数据是压缩的,进行解压,并把文件放在downloadDestinationPath目录中,临时文件被删除
2、如果下载失败,临时文件被直接移到downloadDestinationPath目录,并替换同名文件。
如果你想获取下载中的所有数据,可以实现delegate中的request:didReceiveData:方法。但如果你实现了这个方法,request在下载完后,request并不把文件放在downloadDestinationPath中,需要手工处理。
获取响应信息
信息:status,header,responseEncoding
[requestresponseStatusCode];
[[requestresponseHeaders]objectForKey:@"X-Powered-By"];
[requestresponseEncoding];
获取请求进度
有两个回调方法可以获取请求进度,
1、downloadProgressDelegate,可以获取下载进度
2、uploadProgressDelegate,可以获取上传进度
cookie的支持
如果Cookie存在的话,会把这些信息放在NShttpcookiestorage容器**享,并供下次使用。
你可以用[ ASIHTTPRequest setSessionCookies:nil ] ; 清空所有Cookies。
当然,你也可以取消默认的Cookie策略,而使自定义的Cookie:
//Createacookie
NSDictionary*properties=[[[NSMutableDictionaryalloc]init]autorelease];
[propertiessetValue:[@"TestValue"encodedCookieValue]forKey:NSHTTPCookieValue];
[propertiessetValue:@"ASIHTTPRequestTestCookie"forKey:NSHTTPCookieName];
[propertiessetValue:@".allseeing-i.com"forKey:NSHTTPCookieDomain];
[propertiessetValue:[NSDatedateWithTimeIntervalSinceNow:60*60]forKey:NSHTTPCookieExpires];
[propertiessetValue:@"/asi-http-request/tests"forKey:NSHTTPCookiePath];
NSHTTPCookie*cookie=[[[NSHTTPCookiealloc]initWithProperties:properties]autorelease];
//Thisurlwillreturnthevalueofthe'ASIHTTPRequestTestCookie'cookie
url=[NSURLURLWithString:@"http://allseeing-i.com/ASIHTTPRequest/tests/read_cookie"];
request=[ASIHTTPRequestrequestWithURL:url];
[requestsetUseCookiePersistence:NO];
[requestsetRequestCookies:[NSMutableArrayarrayWithObject:cookie]];
[requeststartSynchronous];
//Shouldbe:Ihave'TestValue'asthevalueof'ASIHTTPRequestTestCookie'
NSLog(@"%@",[requestresponseString]);
大文件断点续传
0.94以后支持大文件的断点下载,只需要设置:
[requestsetAllowResumeForFileDownloads:YES];
[requestsetDownloadDestinationPath:downloadpath];
就可以了。
小结:IOS开发中ASIHTTPRequest里HTTP请求终结者详解的内容介绍完了,希望通过本文的学习能对你有所帮助。
6. ASIHTTPRequest-HTTP授权-流程图

afnetworking 和 asihttprequest 强制修改 http 连接的 host 地址
int main(int argc, char * argv[]) {
@autoreleasepool {
NSString *url = @"https://220.181.111.188";
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration: configuration];
AFSecurityPolicy *sec = [AFSecurityPolicy policyWithPinningMode: AFSSLPinningModePublicKey];
[sec setAllowInvalidCertificates:YES];
[sec setValidatesDomainName:NO];
[manager setSecurityPolicy:sec];
[manager setResponseSerializer:[AFHTTPResponseSerializer serializer]];
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] requestWithMethod: @"GET" URLString:url parameters:nil error:nil];
[request setValue: @"baidu.com" forHTTPHeaderField: @"Host"];
NSURLSessionDataTask *task = [manager dataTaskWithRequest: request completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
if (error) {
NSLog(@"error is %@", error);
}else{
char* bytes = [responseObject bytes];
NSString *str1= [NSString stringWithCString:[responseObject bytes] encoding:NSUTF8StringEncoding];
NSString* str = [NSString stringWithUTF8String:bytes];
NSLog(str);
}
}];
[task resume];
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
afnetworing 中修改方式,测试 demo,若封装,设置一个真实 ip 地址属性解析即可。
==================================================
//add by kings0527
//isHave the fake tagethost
NSString *urlStr = [[self url] absoluteString];
NSURL *realURL = [self url];
if ([self DNSdomain]) {
//dnslookup
// char const *apphost = "itunes.apple.com";
char const *apphost = [[[self url] host] UTF8String];
const char *dnsdomain = [[self DNSdomain] UTF8String];
char *appstoreip = (char *)malloc(16);
nslookup(apphost, dnsdomain, appstoreip);
[self setTargethost: [NSString stringWithUTF8String:appstoreip]];
free(appstoreip);
realURL = [NSURL URLWithString:[urlStr stringByReplacingOccurrencesOfString:[[self url] host] withString:[self targethost]]];
//close https cert validate in IOS9.0
[self setValidatesSecureCertificate:NO];
}
// Create a new HTTP request.
request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, (CFStringRef)[self requestMethod], (CFURLRef)realURL, [self useHTTPVersionOne] ? kCFHTTPVersion1_0 : kCFHTTPVersion1_1);
if (!request) {
[self failWithError:ASIUnableToCreateRequestError];
return;
}
- (void)buildRequestHeaders
{
ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ
ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ
// host
if ([self allowCompressedResponse]) {
[self addRequestHeader:@"Host" value:[[self url] host]];
}
ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ
ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ
}
asihttprequest 使用的是 cfhttpmessage 创建的 request,socket 的创建操作是在 CFReadStreamOpen 的时候进行,而 CFReadStreamOpen 真正的操作其实是调用传入的实例的 class 的 open 函数,最后的解析操作其实是 apple 封装好的通过建立的 request 中的 url 进行 host 取出并且解析 dns,去除此步骤的方法就是直接传入 ip 地址,不需要系统的 dns 解析。
需要注意的是,http 包的包头属性以及包内容都是不可更改的,特别是在 https 的操作中,或者说,正常发往 baidu.com 的包是什么,发往指定 ip 的包就应该是什么,这里就需要在发包之前对 host 属性进行修改,因为默认的包头的 host 都是 cocoa 层自动解析的,指定 ip 地址的话,host 也就变成了地址。
最后值得注意的是,https 的操作,必须关闭本地的 app 证书验证和域名验证,否则出现 ssl handshake 的错误,初期调试遇到此错误时,一时脑梗阻,误以为是 ssl3.0 的双向认证的问题,第二天清醒后才想到的是,本地主动连接非绑定,验证个鸡吧!才想到关闭 https 校验的问题。
afn 的话就大同小异了,多调试几遍源码的话,基本都会看懂了。
ASIHTTPRequest iOS的HTTP开发包
ASIHTTPRequest 介绍
ASI-HTTP-Request是通过CFNetwork API访问Web服务的一个开源封装类库包,使用Objective-
C编写,非常易用,可以应用于iPhone和Mac OS X应用程序。
ASIHTTPRequest使用REST格式与Web服务进行通信,既支持基本的Http请求格式,也通过ASIFormDataRequest类可以很方便地提交POST数据和文件。
ASIHTTPRequest 官网
https://github.com/pokeb/asi-http-request
ASIHTTPRequest —— iOS 的 HTTP 客户端开发包
ASI-HTTP-Request是通过CFNetwork API访问Web服务的一个开源封装类库包,使用Objective-C编写,非常易用,可以应用于iPhone和Mac OS X应用程序。
关于IOS开发:ASIHTTPRequest中HTTP请求终结者详解和http请求结束的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于6. ASIHTTPRequest-HTTP授权-流程图、afnetworking 和 asihttprequest 强制修改 http 连接的 host 地址、ASIHTTPRequest iOS的HTTP开发包、ASIHTTPRequest —— iOS 的 HTTP 客户端开发包的相关信息,请在本站寻找。
本文标签: