本人在开发过程中,由于各种原因。

自己开发了一套HTTP訪问工具。该工具借监了眼下大家都使和的ASI类库。个人感认为ASI里面太多的控制及逻辑变量都写在同一个类中。没有非常好的规划好。同一时候可能是由于多个人的改动,使得ASI不同的版本号出现了不同的兼容方式。

同一时候也不可避免的增辑了对该代码的维护。

出于本人的开发经验自己写了一套这种类库,基本上与ASI的功能上差不太多,可是对存在的未知BUG及使用过程中出现的问题,也希望各读者在使用时将BUG反馈给我,以便修正。

同一时候我把这套原码放在我的GITHUB上。供大家使用。希望大家多多支持我。

GITHUB地址:https://github.com/fengsh998/WebRequestComponent

最新改动已支持block回调。


该类库使用简单。代码通俗易懂。使用OOP进行划分。使得结构更加清晰,更易维护。


类库的类结构图:

自荐亲自写的一套http訪问类库推荐给大家使用。_上传

类关系图:

自荐亲自写的一套http訪问类库推荐给大家使用。_上传_02

类库的执行原理图:

自荐亲自写的一套http訪问类库推荐给大家使用。_desktop_03


类库说明: 

1.        使用GCD线程管理,使用异步请求方式(暂不支持同步请求)。

2.        支持SSL,proxy(http,socket5),cookie。

3.        支持http断点续传(下载)。支持上传、下载进度回调。

4.        支持队列请求。并发请求,组请求。

5.        支持常见http请求,(POST,GET,DELETE,PUT)

6.        支持重定向。

7.        支持GZIP请求。

 

 

类库为非ARC模式。

 

类库支持环境:

IOS:

           Xcode 4.6以上。

 

Mac 10.8.5  xcode5.0以上。仅仅支持64位编译。32位机的没有做适配。所以低版本号的XC编译会有问题。

 

类库依赖:

依赖:

    ios :UIKit.framework,mobileCoreServices.framework

    mac :systemConfiguration.framework,cocoa.framework,appkit.framework

sdk依赖(ios,mac共同依赖):CFNewwork.framework,libz.dylib,Foundation.framework

 

类库的代理说明:

 

@protocolFQWebRequestDelegate <NSObject>

@optional

- (void)requestStarted:(FQWebRequest *)request;

- (void)requestFinished:(FQWebRequest *)request;

- (void)requestFailed:(FQWebRequest *)request;

/*

    当前请求须要证书认证时

    字点中使用的Key

    FQWebAuthenticationUsername

    FQWebAuthenticationPassword

 */

- (NSDictionary*)authenticationNeededForRequest:(FQWebRequest *)request;

- (NSDictionary*)proxyAuthenticationNeededForRequest:(FQWebRequest *)request;

 

/*

    该站点的安全证书不受信任!此时提示仍然继续还是返回安全连接

    假设返回True,则使用不安全连接继续訪问,FALSE则此次訪问失败

 */

- (BOOL)isContinueWhenUnsafeConnectInCureentRequest:(FQWebRequest *)request;

 

/*

    接收到的进度

 */

- (void)requestReceviceProgress:(FQWebRequest *)request

                  withTotalSize:(FQULLInteger) total withRecvicedSize:(FQULLInteger)size;

/*

    发送进度

 */

- (void)requestSendProgress:(FQWebRequest *)request

                  withTotalSize:(FQULLInteger) total withSendSize:(FQULLInteger)size;

 

@end

 

 

@protocolFQWebRequestProgressDelegate <FQWebRequestDelegate>

@optional

/*

     当有数据下发时会触发

 */

- (void)downloadProgress:(FQWebRequest *)request

           withTotalSize:(FQULLInteger) total

        withRecvicedSize:(FQULLInteger)size;

 

/*

     当有post数据时会触发

 */

- (void)uploadProgress:(FQWebRequest *)request

         withTotalSize:(FQULLInteger) total

        withUploadsize:(FQULLInteger)size;

 

@end

 

@protocol FQWebRequestInGroupDelegate<NSObject>

@optional

- (void)allRequestFinish:(FQWebGroupRequest *)groupRequest;

 

@end

 

 

眼下仅仅支持使用delegate进行回调,暂不支持block和SEL的形式进行回调。

 

 

POST 例子:

 

    FQWebRequest *test22 =[FQWebRequestrequestWithURL:@"http://nanjing.baixing.com/oz/login/x"];

    NSMutableDictionary *items = [NSMutableDictionarydictionaryWithObjectsAndKeys:@"keep-alive",@"Connection",

                                  @"*/*",@"Accept",

                                  @"gzip,deflate",@"Accept-Encoding",

                                  @"zh-CN,zh;q=0.8,en;q=0.6",@"Accept-Language",

                                  @"application/x-www-form-urlencoded",@"Content-Type",

                                  nil];

 

    NSString *pd = @"identity=fengsh998&password=13870021792&token=a86d0f446368b94e97f83b309d8cb303";

    NSData *data = [pd dataUsingEncoding:NSUTF8StringEncoding];

    [test22 setPostData:[NSMutableDatadataWithData:data]];

    test22.delegate = self;

    [test22.requestHeader setRequestHeaderByDictionary:items];

    [test22 setRequestMethod:requestUsePost];

   [test22 go];

 

 

GET 例子:

 

    NSMutableDictionary *items = [NSMutableDictionarydictionaryWithObjectsAndKeys:@"keep-alive",@"Connection",

                                  @"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",@"Accept",

                                  @"gzip,deflate",@"Accept-Encoding",

                                  //@"gzip",@"Accept-Encoding",

                                  @"zh-CN,zh;q=0.8,en;q=0.6",@"Accept-Language",

                                  nil];

   

   

    FQWebRequest *test1 =[FQWebRequestrequestWithURL:@"http://www.google.com.hk"];

   

    [test1.requestHeader setRequestHeaderByDictionary:items];

    [test1 setRequestMethod:requestUseGet];

    //test1.autoSaveUseCookies=YES;

   [test1 go];

 

 

类点下载例子:

 

weq = [FQDownLoadRequestrequestWithURL:@"http://a.tgbus.com/download/33747/1"];

    NSMutableDictionary *items = [NSMutableDictionarydictionaryWithObjectsAndKeys:

                                  @"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",@"Accept",

                                  @"gzip,deflate,sdch",@"Accept-Encoding",

                                  @"zh-CN,zh;q=0.8,en;q=0.6",@"Accept-Language",

                                  //@"keep-alive",@"Connection",

                                  //@"User-Agent",@"Mozilla/5.0 (Macintosh;Intel Mac OS X 10_8_5)",

                                  //@"",@"",

                                  nil];

   

    [weq setDownloadStorePath:@"/Users/apple/Desktop/FQDownload"];

  

    [weq.requestHeadersetRequestHeaderByDictionary:items];

    //[weq setRequestMethod:requestUseGet];

    weq.delegate =self;

    FQWebProxySettings *proxy = [[FQWebProxySettingsalloc]init];

    //weq.proxySettings = proxy;

    [proxy release];

    //weq.proxySettings.proxyHost =@"211.138.121.38";

    //weq.proxySettings.proxyPort = 81;

    //weq.proxySettings.proxyType = wpProxyHttp;

    //weq.useCustomSaveFileName = @"aa.apk";

    [weq setReDownloadFile:@"银行大劫案BankJob.apk.FQDownload" useResume:YES];

    [weq go];

 

POST FORM表单上传例子:

 

FQUploadRequest *rq = [FQUploadRequestrequestWithURL:@"http://www.mftp.info/upload.php"];

    NSMutableDictionary *items = [NSMutableDictionarydictionaryWithObjectsAndKeys:@"keep-alive",@"Connection",

                                  @"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",@"Accept",

                                  @"gzip,deflate",@"Accept-Encoding",

                                  @"zh-CN,zh;q=0.8,en;q=0.6",@"Accept-Language",

                                  @"application/x-www-form-urlencoded",@"Content-Type",

                                  nil];

   

    [rq.requestHeader setRequestHeaderByDictionary:items];

   

    FormDataPackage *dp = [[FormDataPackagealloc]init];

    MimePart *filepart = [[MimePartalloc]init];

    [filepart addMimeHeader:@"Content-Disposition"withValue:@"form-data;name=\"MAX_FILE_SIZE\""];

    filepart.bodystring = @"1000000";

   

    MimePart *filepart1 = [[MimePartalloc]init];

    [filepart1 addMimeHeader:@"Content-Disposition"withValue:@"form-data;name=\"uploadimg\"; filename=\"银行大劫案BankJob.apk\""];

    [filepart1 addMimeHeader:@"Content-Type"withValue:@"application/octet-stream"];

   

    NSMutableData *md = [NSMutableDatadataWithContentsOfFile:@"/Users/apple/Desktop/FQDownload/银行大劫案BankJob.apk.FQDownload"];

    filepart1.bodyFileData = md;

   

   

    [dp addMultiPart:filepart];

    [dp addMultiPart:filepart1];

   

    dp.postBodyType = postformMultipartData;

   

    //NSData *dt = [dpbuildMultipartFormDataPostBody];

   

    //[rq setRequestMethod:requestUsePost];

    //[rq.requestHeadersetRequestHeader:@"Content-Type" value:dp.contentTypeValue];

 

   

    rq.delegate = self;

    //[rq setPostData:[NSMutableDatadataWithData:dt]];

    //[rqsetPostBodyFromFile:@"/Users/apple/Desktop/FQDownload/银行大劫案BankJob.apk.FQDownload"];

   

    [rq setuploadFormData:dp];

    [rq go];

 

 

对于multi表单类型的form:

 

FQUploadRequest *rq = [FQUploadRequestrequestWithURL:@"http://www.dumpt.com/img/upload.php"];

    NSMutableDictionary *items = [NSMutableDictionarydictionaryWithObjectsAndKeys:@"keep-aflive",@"Connection",

                                  @"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",@"Accept",

                                  @"gzip,deflate",@"Accept-Encoding",

                                  @"zh-CN,zh;q=0.8,en;q=0.6",@"Accept-Language",

                                  @"application/x-www-form-urlencoded",@"Content-Type",

                                  nil];

   

    [rq.requestHeader setRequestHeaderByDictionary:items];

   

    FormDataPackage *dp = [[FormDataPackagealloc]init];

    dp.postBodyType = postformMultipartData;

   

    MimePart *filepart = [[MimePartalloc]init];

    [filepart addMimeHeader:@"Content-Disposition"withValue:@"form-data;name=\"type\""];

    filepart.bodystring = @"direct";

   

    MimePart *filepart1 = [[MimePartalloc]init];

    [filepart1 addMimeHeader:@"Content-Disposition"withValue:@"form-data;name=\"userfile[]\"; filename=\"2.png\""];

    [filepart1 addMimeHeader:@"Content-Type"withValue:@"image/png"];

   

    NSMutableData *md = [NSMutableDatadataWithContentsOfFile:@"/Users/apple/Desktop/2.png"];

    filepart1.bodyFileData = md;

   

    MimePart *filepart2 = [[MimePartalloc]init];

    [filepart2 addMimeHeader:@"Content-Disposition"withValue:@"form-data;name=\"userfile[]\"; filename=\"\""];

    [filepart2 addMimeHeader:@"Content-Type"withValue:@"application/octet-stream"];

   

    MimePart *filepart3 = [[MimePartalloc]init];

    [filepart3 addMimeHeader:@"Content-Disposition"withValue:@"form-data;name=\"userfile[]\"; filename=\"\""];

    [filepart3 addMimeHeader:@"Content-Type"withValue:@"application/octet-stream"];

   

   

    MimePart *filepart4 = [[MimePartalloc]init];

    [filepart4 addMimeHeader:@"Content-Disposition"withValue:@"form-data;name=\"userfile[]\"; filename=\"\""];

    [filepart4 addMimeHeader:@"Content-Type"withValue:@"application/octet-stream"];

   

   

    MimePart *filepart5 = [[MimePartalloc]init];

    [filepart5 addMimeHeader:@"Content-Disposition"withValue:@"form-data;name=\"userfile[]\"; filename=\"\""];

    [filepart5 addMimeHeader:@"Content-Type"withValue:@"application/octet-stream"];

   

    MimePart *filepart6 = [[MimePartalloc]init];

    [filepart6 addMimeHeader:@"Content-Disposition"withValue:@"form-data;name=\"x\""];

    filepart6.bodystring = @"64";

   

    MimePart *filepart7 = [[MimePartalloc]init];

    [filepart7 addMimeHeader:@"Content-Disposition"withValue:@"form-data;name=\"y\""];

    filepart7.bodystring = @"13";

   

    [dp addMultiPart:filepart];

    [dp addMultiPart:filepart1];

    [dp addMultiPart:filepart2];

    [dp addMultiPart:filepart3];

    [dp addMultiPart:filepart4];

    [dp addMultiPart:filepart5];

    [dp addMultiPart:filepart6];

    [dp addMultiPart:filepart7];

   

    [rq  setuploadFormData:dp];

 

    rq.delegate = self;

    [rqgo];