ASIHTTPRequest文档

ASIHTTPRequest文档
最后更新日期:2011年5月15日(V1.8.1)
关于安装说明如何使用它亚马逊S3云的Rackspace文件ASIWebPageRequest更新日志谁在使用它?
跳转到➪
创建和运行的请求
创建一个同步请求


最简单的方式来使用ASIHTTPRequest。发送startSynchronous消息将执行在相同的线程的请求,并且当它已经(成功地或以其它方式)完成返回控制。


通过检查error属性检查问题。


获得响应作为一个字符串,调用responseString方法。不要使用此二进制数据 - 使用responseData得到一个NSData对象,或者,对于大文件,设置您的要求下载与downloadDestinationPath性文件。


- (IBAction为你)grabURL:(ID)发件人
{
  NSURL* URL =[NSURL URLWithString:@“http://allseeing-i.com”];
  ASIHTTPRequest*要求=[ASIHTTPRequest requestWithURL:URL]
  [要求startSynchronous]
  NSError*错误=[请求错误]
  如果(!错误){
    * NSString的响应=[要求responseString]
  }
}


在一般情况下,你应该使用优先于同步请求异步请求。当您使用ASIHTTPRequest同步从主线程,应用程序的用户界面将锁定并变得不可用的请求的持续时间。
创建一个异步请求


做同样的事情与前面的例子,但请求在后台运行。


- (IBAction为你)grabURLInBackground:(ID)发件人
{
   NSURL* URL =[NSURL URLWithString:@“http://allseeing-i.com”];
   ASIHTTPRequest*要求=[ASIHTTPRequest requestWithURL:URL]
   [要求setDelegate:个体经营];
   [要求startAsynchronous]
}
 
- (无效)requestFinished:(ASIHTTPRequest*)的请求
{
   //使用获取的文本数据时
   *的NSString= responseString[要求responseString]
 
   //获取使用二进制数据时
   NSData的* responseData=[要求responseData]
}
 
- (无效)requestFailed:(ASIHTTPRequest*)的请求
{
   NSError*错误=[请求错误]
}
请注意,我们设置请求的委托财产,所以我们可以请求完成或失败时收到通知。


这是创建一个异步请求的最简单的方法,并且将在后面的场景的全局NSOperationQueue运行。对于更复杂的操作(如跟踪跨多个请求的进展),你可能想创建自己的队列,这是我们会在下面。


使用块


为V1.8,我们可以使用块,在支持它们的平台上做同样的事情:


- (IBAction为你)grabURLInBackground:(ID)发件人
{
   NSURL* URL =[NSURL URLWithString:@“http://allseeing-i.com”];
   __block ASIHTTPRequest*要求=[ASIHTTPRequest requestWithURL:URL]
   [要求setCompletionBlock:^{
      //使用获取的文本数据时
      *的NSString= responseString[要求responseString]
 
      //获取使用二进制数据时
      NSData的* responseData=[要求responseData]
   }];
   [要求setFailedBlock:^{
      NSError*错误=[请求错误]
   }];
   [要求startAsynchronous]
}
注意使用__block预选赛的时候我们声明的要求,这是非常重要的!它告诉该块不保留的请求,这是在防止一个保留周期很重要,因为该请求将总是保留块。


使用队列


这个例子做同样的事情了,但我们已经创建了一个NSOperationQueue对我们的要求。


使用NSOperationQueue(或ASINetworkQueue,见下文),你自己创建的为您提供了更多的控制异步请求。当使用一队列中,只有一定数量的请求可以在同一时间运行。如果你比排队的maxConcurrentOperationCount属性添加更多的请求,请求将等待别人来他们开始前完成。


- (IBAction为你)grabURLInTheBackground:(ID)发件人
{
   如果(![个体经营队列]){
      [自我setQueue:[[[NSOperationQueue页头] INIT]自动释放];
   }
 
   NSURL* URL =[NSURL URLWithString:@“http://allseeing-i.com”];
   ASIHTTPRequest*要求=[ASIHTTPRequest requestWithURL:URL]
   [要求setDelegate:个体经营];
   [要求setDidFinishSelector:@selector(requestDone:)];
   [要求setDidFailSelector:@selector(requestWentWrong:)];
   [自我队列] addOperation:要求]; //队列是NSOperationQueue
}
 
- (无效)requestDone:(ASIHTTPRequest*)的请求
{
   * NSString的响应=[要求responseString]
}
 
- (无效)requestWentWrong:(ASIHTTPRequest*)的请求
{
   NSError*错误=[请求错误]
}
 
另外,在上述示例中,“排队”,是我们的控制器的一个保留NSOperationQueue属性。


我们设置请求成功或失败时,将调用自定义选择。如果不设置这些,默认值(requestFinished:和requestFailed:)将被使用,因为在前面的例子。


处理成功和失败的委托方法的多个请求


如果你需要处理的成功和失败在许多不同类型的要求,您有几种选择:


如果您的要求都是一样的广泛类型的,但你要区分它们,你可以设置每个请求与自己的自定义的数据,你可以在你完成/失败的委托方法读取的用户信息NSDictionary的财产。对于简单的情况下,可以设置请求的标签属性。这两个属性是供自己使用,而不是发送到服务器。
如果您需要处理在一个完全不同的方式为每个请求的成功和失败,为每个请求设置不同的setDidFinishSelector/ setDidFailSelector
对于更复杂的情况,或要解析的背景响应,创建ASIHTTPRequest的最小的子类,每种类型的请求,并覆盖requestFinished:和failWithError:.


这是最好避免使用请求的URL在你的委托方法的不同请求之间进行区分,因为当一个请求重定向的URL属性可以改变。如果你真的想用请求的URL,使用[要求originalURL]代替 - 这将永远是第一个URL请求连接。
关于ASINetworkQueues


ASINetworkQueue是NSOperationQueue的子类,提供了一些额外的功能。


其主要目的是为了让您跟踪上传和/或下载整个队列(了解更多关于进度跟踪)的进展情况。


此外,ASINetworkQueues提供一些额外的委托方法选择:


requestDidStartSelector
所谓的队列中的请求,开始运行的每个时间。您添加到队列中,你可以使用它作为替代上的请求指定didStartSelector并设置一个委托
requestDidReceiveResponseHeadersSelector
所谓每个队列的请求接收来自服务器的响应头的时间。对于大的下载量,这可能是一段时间的要求,其实完成之前。您添加到队列中,你可以使用它作为替代上的请求指定didReceiveResponseHeadersSelector并设置一个委托
requestDidFinishSelector
所谓每个队列中的请求成功完成的时间。您添加到队列中,你可以使用它作为替代上的请求指定didFinishSelector并设置一个委托
requestDidFailSelector
所谓每个队列中的请求失败的时间。您添加到队列中,你可以使用它作为替代上的请求指定didFailSelector并设置一个委托
queueDidFinishSelector
所谓当整个队列已完成,个别请求是否成功。
使用这些,设置队列(而不是请求的代理),以实现该选择器所代表的方法的控制器的委托。




ASINetworkQueues工作略有不同NSOperationQueues,在请求加入到他们不会立即开始运行。当使用ASINetworkQueue,加入所有你想要运行的作业,然后调用[队列中去。当你开始一个准确的进展队列打开,它会先执行HEAD请求队列中所有的GET请求获取要下载的数据的总大小。一旦它具有的总的大小,它可以准确地显示出的总的进展,和真正的请求将启动。




当您添加已启动的请求到ASINetworkQueue会发生什么?
如果您使用的是ASINetworkQueue追踪几个请求的总体进度,整体推进会向后移动,以顾及每个新的请求,只有当要求开始运行。一个ASINetworkQueue不会执行队列启动后加入的请求HEAD请求,所以如果你增加了许多要求到正在运行的队列一次,总体进度不会立刻更新。
如果队列已经在运行,你并不需要调用[队列中去]了。


当在ASINetworkQueue请求失败,队列将默认取消所有其他请求。您可以禁用此行为与[队列setShouldCancelAllRequestsOnFailure:NO]。


ASINetworkQueues只能运行ASIHTTPRequest操作,它们不能用于通用操作。尝试添加一个的NSOperation不是一个ASIHTTPRequest将产生一个异常。




这里有一个完整的例子,显示了创建和使用ASINetworkQueue的基础:
http://gist.github.com/150447
取消一个异步请求


要取消一个异步请求(无论是开始用[要求startAsynchronous]或创建一个队列运行的要求,即要求),调用[申请取消]。请注意,您无法取消同步请求。


请注意,当您取消一个请求,请求将其视为一个错误,并会打电话给你的委托和/或队列的失败委托方法。如果你不希望这种行为,呼吁取消或使用clearDelegatesAndCancel方法,而不是之前设置您的代理为零。


//取消异步请求
[申请取消]
 
//取消异步请求,首先清除所有与会代表和块
[要求clearDelegatesAndCancel]
当使用ASINetworkQueue,所有其他请求都将被当您取消个人请求,除非队列的shouldCancelAllRequestsOnFailure是NO(YES是默认值)取消。


//当此队列中的请求失败或取消,其他请求将继续运行
[队列setShouldCancelAllRequestsOnFailure:NO];
 
//取消队列中的所有请求
[排队cancelAllOperations]
安全处理委托被释放的请求已经完成之前


要求不保留自己的代表,因此,如果有一个机会,而你的要求运行您的代理可以被释放,您清除请求的委托性是至关重要的。在大多数情况下,如果您的代理将被释放,你可能也想取消请求,因为你不再关心请求的状态。


在下面的例子中,我们的控制器具有存储在一个保留实例变量的ASIHTTPRequest。我们称它的clearDelegatesAndCancel方法是实施的dealloc,就在我们发布我们的参考请求:


// Ddealloc方法我们的控制器
- (无效)的dealloc
{
   [要求clearDelegatesAndCancel]
   [申请发行];
   ...
   [超级的dealloc];
}
发送数据
设置请求头


ASIHTTPRequest*要求=[ASIHTTPRequest requestWithURL:URL]
[要求addRequestHeader:@“Referer的”值:@“http://allseeing-i.com/”];
发送表单POST与ASIFormDataRequest


发送POST数据与网页形式兼容的方式,使用附带的ASIFormDataRequest子类。数据是'/ X WWW的形式,进行了urlencoded的应用程序“的格式,或”多部分/表单数据“格式上传二进制数据或文件时,张贴在。在文件中的数据按需要从磁盘读取,所以张贴大文件就OK了,只要你的Web服务器是安装程序来处理它们。


ASIFormDataRequest*要求=[ASIFormDataRequest requestWithURL:URL]
[要求setPostValue:@“奔”forKey:@“如first_name”];
[要求setPostValue:@“科普塞”forKey:@“姓氏”];
[要求setFile:@“/用户/ BEN /桌面/ ben.jpg”forKey:@“照片”];
ASIFormDataRequest将自动检测文件的MIME类型(在iOS3.0或更高版本的Mac)中加入POST通过setFile:forKey:和包括这发送到服务器的MIME头。如果你喜欢,你可以使用更长的形式覆盖此:


ASIFormDataRequest*要求=[ASIFormDataRequest requestWithURL:URL]
 
//上传磁盘上的文件
[要求setFile:@“/用户/ BEN /桌面/ ben.jpg”withFileName:@“myphoto.jpg”andContentType:@“为image / jpeg”
forKey:@“照片”];
 
//上传一个NSData实例
[要求使用setData:为imageData withFileName:@“myphoto.jpg”andContentType:@“为image / jpeg”forKey:@“照片”];
 
您可以发送多个值使用替代附加API相同的参数:


ASIFormDataRequest*要求=[ASIFormDataRequest requestWithURL:URL]
[要求addPostValue:@“奔”forKey:@“名”];
[要求addPostValue:@“乔治”forKey:@“名”];
[要求addFile:@“/用户/ BEN /桌面/ ben.jpg”forKey:@“照片”];
[要求addData:为imageData withFileName:@“george.jpg”andContentType:@“为image / jpeg”forKey:@“照片”];
见ASIFormDataRequest.h让所有人参数添加到您的POST方式的完整列表。


PUT请求和自定义的POST


如果你想通过PUT发送的数据,或者想用POST发送,但更喜欢自己创建的POST体,使用appendPostData:或appendPostDataFromFile:.


ASIHTTPRequest*要求=[ASIHTTPRequest requestWithURL:URL]
[要求appendPostData:[@“这是我的数据”dataUsingEncoding:NSUTF8StringEncoding]];
//默认变成POST当您使用appendPostData:/ appendPostDataFromFile:/ setPostBody:
[要求setRequestMethod:@“PUT”];
如果你想发送大量数据,并且不使用ASIFormDataRequest,看到从下面流盘体后的信息。


下载数据
直接下载响应于一个文件


如果您所请求的资源是相当大的,你可以通过直接下载到文件节省内存。这样一来,ASIHTTPRequest不会保持在存储器中的整个反应一次。


ASIHTTPRequest*要求=[ASIHTTPRequest requestWithURL:URL]
[要求setDownloadDestinationPath:@“/用户/ BEN /桌面/ my_file.txt适用”];
当使用downloadDestinationPath数据下载到一个文件中,数据将被保存在一个临时文件,而请求正在进行中。该文件的路径存储在temporaryFileDownloadPath。当请求成功完成,以下两种情况之一发生:


如果数据被gzip压缩的(见gzip压缩信息),压缩后的文件将被解压缩到downloadDestinationPath以及临时文件将被删除
如果数据没有被压缩,临时文件移动到downloadDestinationPath,覆盖以前的任何文件


需要注意的是,如果反应体是空的,没有文件将被创建。如果有可能的请求可能会返回一个空的身体,一定要检查该文件存在您试图用它做任何事情之前。
处理响应数据到达时


如果你需要处理的响应,因为它涉及的(例如,你想使用流解析器解析响应,即使它仍在下载时),有你的委托实施的要求:didReceiveData:(见ASIHTTPRequestDelegate.h)。需要注意的是,当你做到这一点,ASIHTTPRequest将不填充responseData或写响应downloadDestinationPath - 你必须自己保存的反应,如果你需要。


读取HTTP状态代码


ASIHTTPRequest没有做什么特别的事情与大多数HTTP状态代码(除重定向和认证状态代码,请参阅下面的更多信息),所以它是给你看出来的问题(例如:404),并确保您采取适当行动。


ASIHTTPRequest*要求=[ASIHTTPRequest requestWithURL:URL]
[要求startSynchronous]
INT的StatusCode=[要求responseStatusCode]
*的NSString= statusMessage[要求responseStatusMessage]
阅读响应头


ASIHTTPRequest*要求=[ASIHTTPRequest requestWithURL:URL]
[要求startSynchronous]
*的NSString= Poweredby的[要求responseHeaders响应] objectForKey:@“X-Powered-By中”];
*的NSString的contentType=[要求responseHeaders响应] objectForKey:@“的Content-Type”];
处理文本编码


ASIHTTPRequest将尝试读取从Content-Type头接收到的数据的文字编码。如果找到文本编码,它会设置的ResponseEncoding到相应NSStringEncoding。如果没有发现,在头文字编码,它会使用defaultResponseEncoding的值(默认为NSISOLatin1StringEncoding)。


当你调用[要求responseString],ASIHTTPRequest将尝试创建它接收到的数据串,使用的ResponseEncoding作为源编码。


处理重定向


ASIHTTPRequest会自动重定向到它遇到的以下HTTP状态代码之一,当一个新的URL,假设一个位置头球攻门被送往:


301永久移动
302发现
303查看其他
当重定向发生时,响应数据(responseHeaders响应/ responseCookies/ responseData/ responseString等)的值将反映出从最终位置接收到的内容。


在任何期间重定向循环中遇到的网址的设置cookie将被存储在全局cookie存储,并且将表示上的重定向请求时适当的服务器。


您可以通过请求的shouldRedirect属性设置为NO关闭自动重定向。




默认情况下,自动重定向总是重定向使用GET请求(无正文)。这种行为符合大多数浏览器的工作方式,而不是HTTP规范,其中规定,301和302重定向应该用原来的方法。
为了保持原来的方法(包括请求体)为301和302重定向,设置shouldUseRFC2616RedirectBehaviour为YES就要求你开始之前。
跟踪进度
每个ASIHTTPRequest有两名代表,可用于跟踪进展 - downloadProgressDelegate(用于下载),并uploadProgressDelegate(上载)。


进步的代表可以NSProgressIndicators键(Mac OS X)或UIProgressViews(iPhone)。 ASIHTTPRequest会自动满足于这两类行为的差异。如果你愿意,你也可以使用自定义类作为进度委托,只要它响应setProgress:。


如果您正在执行一个请求,你设置的上传和/或下载进度委托该请求
如果您正在执行队列中的多个请求,并要跟踪的队列中的所有请求,整体推进,用ASINetworkQueue并设置队列的进度委托
如果想在同时执行这两个,这是可能的太(如v0.97的)


重要提示:如果您上传到一个网站需要身份验证,上传进度将被重置到其以前的值每未能提供有效的认证时间。出于这个原因,建议您只使用过的上传进度委托时useSessionPersistence是YES(见下文)与验证的Web服务器进行通信时,确保您在另一个请求验证尝试跟踪大量的上传前数据。


跟踪进度上传那里请求主体小于128KB,目前不可能。比128KB较大的请求,进度委托不会收到数据后的第一个128KB的进展情况。这是因为CFNetwork的API中的限制。我已经提出了增强功能与苹果(错误ID6596016),希望他们将修改CFNetwork的未来,使这一切成为可能。
更新2009年6月21日:美妙的人,在苹果很友好地解决我的错误报告!在iPhone3.0 SDK,它看起来像缓冲区的大小已减少到32KB,这使得准确的上传进度跟踪了很多更可靠。
跟踪下载进度的一个请求


在这个例子中,myProgressIndicator是NSProgressIndicator。


ASIHTTPRequest*要求=[ASIHTTPRequest requestWithURL:URL]
[要求setDownloadProgressDelegate:myProgressIndicator]
[要求startSynchronous]
的NSLog(@“马克斯:%F,值:%F”,[myProgressIndicator maxValue(最大值)],[myProgressIndicator的doubleValue]);
跟踪下载进度的一组请求


在这个例子中,myProgressIndicator是UIProgressView,myQueue中是一个ASINetworkQueue。


- (无效)fetchThisURLFiveTimes:(NSURL*)网址
{
   [myQueue中cancelAllOperations]
   [myQueue中setDownloadProgressDelegate:myProgressIndicator]
   [myQueue中setDelegate:个体经营];
   [myQueue中setRequestDidFinishSelector:@selector(queueComplete:)];
   INT I;
   对于(i =0; I <5;我++){
      ASIHTTPRequest*要求=[ASIHTTPRequest requestWithURL:URL]
      [myQueue中addOperation:申请];
   }
   [myQueue中去]。
}
 
- (无效)queueComplete:(ASINetworkQueue*)队列
{
   的NSLog(@“值:%F”,[myProgressIndicator进度]);
}
请注意,对于ASINetworkQueues,我们要调用[myQueue中去]开始排队。


跟踪上传进度为单个请求


在这个例子中,myProgressIndicator是UIProgressView。


ASIFormDataRequest*要求=[ASIFormDataRequest requestWithURL:URL]
[要求setPostValue:@“奔”forKey:@“如first_name”];
[要求setPostValue:@“科普塞”forKey:@“姓氏”];
[要求setUploadProgressDelegate:myProgressIndicator]
[要求startSynchronous]
的NSLog(@“值:%F”,[myProgressIndicator进度]);
跟踪上传进度的一组请求


在这个例子中,myProgressIndicator是NSProgressIndicator,myQueue中是一个ASINetworkQueue。


- (无效)uploadSomethingFiveTimes:(NSURL*)网址
{
   [myQueue中cancelAllOperations]
   [myQueue中setUploadProgressDelegate:myProgressIndicator]
   [myQueue中setDelegate:个体经营];
   [myQueue中setRequestDidFinishSelector:@selector(queueComplete:)];
   INT I;
   对于(i =0; I <5;我++){
      ASIHTTPRequest*要求=[ASIFormDataRequest requestWithURL:URL]
      [要求setPostBody:[@“有些数据”dataUsingEncoding:NSUTF8StringEncoding]];
      [myQueue中addOperation:申请];
   }
   [myQueue中去]。
}
 
- (无效)queueComplete:(ASINetworkQueue*)队列
{
   的NSLog(@“马克斯:%F,值:%F”,[myProgressIndicator maxValue(最大值)],[myProgressIndicator的doubleValue]);
}
准确进步VS简单进度


ASIHTTPRequest提供了两种方法来显示进度,简单的进度和准确的进展。他们正在使用ASIHTTPRequests和ASINetworkQueues的showAccurateProgress控制。当你在一个请求设置showAccurateProgress,只会影响该请求。当你在一个队列进行设置,它影响队列中的所有请求。


简单的进度
当使用简单进度,进度会请求完成时只更新。对于一个请求,这意味着你得到两个最新进展 - 0%完整,100%完成。对于一个具有四个请求队列中,你会得到5进度更新,0%,25%,50%,75%和100%,以每个增量表示已完成的请求。


简单的进度(showAccurateProgress= NO)是默认的ASINetworkQueues,是非常适合的队列有大量小的上传/下载。


准确的进度
当使用精确的进展,进展将作为字节被发送或接收的更新。最好是对于发送或接收大量的数据,并且将得到更好的指示多少数据已被发送或接收该需要一定的时间的请求的请求。


使用精确的进展将略微降低载的性能,因为进展代表(这很可能是UIProgressViews或NSProgressIndicators)将被更频繁地重画。


使用一个队列时,由于队列将首先执行HEAD请求为每个GET请求它包含所以它可确定数据的总尺寸,以在下载开始之前被下载使用精确进度对用于下载性能更大的效果。使用精确的进步强烈建议,如果你是从一个队列下载大文件,但你应该避免它含有大量的小的下载队列。


准确的进展(showAccurateProgress== YES)是默认的运行同步ASIHTTPRequests。


自定义进度追踪


该ASIProgressDelegate协议定义的所有方法的委托可以得到一个请求的最新进展。在大多数情况下,你的uploadProgressDelegate和/或downloadProgressDelegate设置为一个NSProgressIndicator或UIProgressView就足够了。但是,如果要执行更复杂的进度跟踪,你的进步代表应实施优先于setProgress以下方法:(IOS)或setDoubleValue:/ setMaxValue:(苹果机)。这些方法允许你上被发送或接收的,而不是0和1之间你得到的更简单的方法的数目的实际字节数的更新。


方法downloadProgressDelegates
要求:didReceiveBytes:将你的downloadProgressDelegate每次请求下载一个位更多的数据被调用。 (注意,这是从请求鲜明:didReceiveData:您定期委托可实施方法)。
要求:incrementDownloadSizeBy:将被调用时的下载变化的大小,传递的参数是你应该增加下载量的大小。当请求得到响应头,发现了下载的大小这通常发生。
方法uploadProgressDelegates
要求:didSendBytes:将你的uploadProgressDelegate每次请求已经能够发送更多的数据被调用。重要的是:这种方法将被称为具有一个小于零时,请求需要除去上传进度(通常当它已上载的数据,但失败的认证或需要再次某些其他原因运行)。
要求:incrementUploadSizeBy:将被调用时上传的大小变化。传递的大小会频繁低于零,作为请求调整载大小以考虑所使用的操作系统的内部缓冲器的大小。
处理HTTP认证
如果你连接到要求身份验证的服务器,你可能想看看这个流程图,显示了如何ASIHTTPRequest发现并应用凭据请求。


指定的用户名和密码,在URL中使用


NSURL* URL =[NSURL URLWithString:@“的http://用户名:password@allseeing-i.com/top_secret/”];
ASIHTTPRequest*要求=[ASIHTTPRequest requestWithURL:URL]
设置的用户名和密码,以对请求使用


NSURL* URL =[NSURL URLWithString:@“http://allseeing-i.com/top_secret/”];
ASIHTTPRequest*要求=[ASIHTTPRequest requestWithURL:URL]
[要求setUsername:@“用户名”];
[要求setPassword:@“密码”];
在钥匙串中存储的凭据


如果你打开keychainPersistence,任何有效的用户名和密码,提供将存储在钥匙串。后续请求将重新使用钥匙串的用户名和密码,即使你退出并重新启动应用程序。


NSURL* URL =[NSURL URLWithString:@“http://allseeing-i.com/top_secret/”];
ASIHTTPRequest*要求=[ASIHTTPRequest requestWithURL:URL]
[要求setUseKeychainPersistence:YES];
[要求setUsername:@“用户名”];
[要求setPassword:@“密码”];
如果你想使用钥匙串却宁愿自己管理,你可能会发现关于在ASIHTTPRequest.h有用钥匙串类的方法。


在会话中存储的凭据


如果useSessionPersistence开启(这是默认设置),在内存ASIHTTPRequest商店凭据,可以重新使用他们的后续请求。


NSURL* URL =[NSURL URLWithString:@“http://allseeing-i.com/top_secret/”];
ASIHTTPRequest*要求=[ASIHTTPRequest requestWithURL:URL]
[要求setUsername:@“用户名”];
[要求setPassword:@“密码”];
[要求setUseSessionPersistence:YES]; //应该没有必要,因为这是默认
 
//应该重新使用我们的用户名和密码
要求=[ASIHTTPRequest requestWithURL:URL]
NTLM身份验证


为了与使用NTLM计划在Windows服务器进行身份验证,还需要指定要对身份验证域。


NSURL* URL =[NSURL URLWithString:@“HTTP://my.windows.server/top_secret/”];
ASIHTTPRequest*要求=[ASIHTTPRequest requestWithURL:URL]
[要求setUsername:@“用户名”];
[要求setPassword:@“密码”];
[要求setDomain:@“我的域”];
使用代表团提供凭据


而不是事先指定的身份验证凭据,您可能希望让每个请求要求与其委托的凭据,如果它不能找到它们在会话认证缓存或钥匙串。如果你想连接到你不知道事先什么样的身份验证(如果有的话)的服务器将需要这可能会有帮助。


确保您的委托实现authenticationNeededForRequest:和ASIHTTPRequest将暂停请求在等待委托,让它知道证书才能使用的东西。当你有你需要的凭据,只需将他们的请求,并调用[要求retryUsingSuppliedCredentials];.如果要取消,必须调用[要求cancelAuthentication]。这将取消该请求。


为v1.0.8的,要求代表将只能收到一个authenticationNeededForRequest:或proxyAuthenticationNeededForRequest:一次。需要验证的其他请求都将暂停,而委托处理的第一个请求。如果提供的凭据,目前正在进行中的任何其他请求将尝试重用他们,假设他们是有效的URL。如果委托取消认证,以及队列的shouldCancelAllRequestsOnFailure是YES,其他所有的请求都将取消而不试图索要凭证。




使用同步请求时,您不能使用委托模式进行身份验证。
在旧版本中,这会造成你的应用程序挂起,因为v1.0.8的委托方法将不再被调用。
图片代理验证对话框
使用内置的身份验证对话框(目前只IOS)


新的v1.0.8是ASIAuthenticationDialog类。这主要用于与认证代理(见下文)的工作,但是它可以用于询问用于验证网络服务器凭证的用户。


为了获得最佳的用户体验,连接到一个单一的服务大多数应用程序应该实现authenticationNeededForRequest:在他们的要求的代表,或避免使用代表团式的认证完全。然而,可能存在某些场合,当使用ASIHTTPRequest的标准认证对话框的定期身份验证可以是有利的:


你不想创建自己的登录表单
可能需要从外部源获取数据,并不能确定它是否会要求验证或不
对于这些情况,shouldPresentAuthenticationDialog设为您的要求真的,如果你的委托不落实authenticationNeededForRequest:,用户会看到对话框。


只有一个对话框就会出现一次,并要求认证的其他请求将暂停,而对话是可见的。如果提供的凭据,目前正在进行中的任何其他请求将尝试重用他们,假设他们是有效的URL。如果委托取消认证,以及队列的shouldCancelAllRequestsOnFailure是YES(按默认值),其他所有的请求都将取消而不试图索要凭证。


身份验证对话框将不会出现同步请求。


对话部分是模拟的Safari浏览器上使用的iPhone,并包括验证对话框:


一则消息,表示这些凭据是一个Web服务器(而不是代理)
要连接到服务器的主机名或IP
认证领域(如果已提供)
字段输入用户名和密码
当连接到使用NTLM方案的服务器,该对话框还包括域场
是否凭据的注意事项发送纯文本或没有(即:他们正在使用基本身份验证,只有当发送纯文本无SSL)










重要提示
































曲奇饼














































 
//这个网址将返回“ASIHTTPRequestTestCookie”cookie的值










 
//应该是:我有“测试值”为“ASIHTTPRequestTestCookie”的价值


























{
  
  
  
  
  
  
  
  
  
}














































{
  
    
  
 
  
 
  
  
 
  
  
  
  
 
  
  
}












































 
































































































 




 




 




















































































 








 




 






   
 






























 






 






 




 


























 




























 
//或者,您也可以使用手动指定的代理自动配置文件(PAC)
//(这也可能是最好的,如果你使用一个本地文件)






















 






 












































































 




}












































//设置的时间挂在一个持久连接之前,应该过期2分钟


 
//完全禁用持久连接
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值