TestsTested | ✗ |
LangLanguage | Obj-CObjective C |
License | MIT |
ReleasedLast Release | Jan 2017 |
Maintained by spirit-jsb.
JSNetworking: 轻量级网络层封装, 基于 AFNetworking 3.1.0
pod 'JSNetworking', '~> 1.2.0'
#import "JSNetworking.h"
[JSCenterManager setupConfig:^(JSConfigManager *config) {
config.commenServer = @"commen server address";
config.commenHeaders = @{@"commen header": @"commen header value"};
config.commenParameters = @{@"commen parameters": @"commen parameters value"};
config.commenUserInfo = nil;
config.callbackQueue = dispatch_get_main_queue();
#ifdef DEBUG
config.consoleLog = YES;
#endif
}];
你可以通过调用 JSCenterManager
的以下两个类方法来随时修改全局公共的 header
和 parameter
:
+ (void)setCommenHeaderValue:(NSString *)value
forKey:(NSString *)key;
+ (void)setCommenParameterValue:(NSString *)value
forKey:(NSString *)key;
[JSCenterManager sendRequest:^(JSRequestManager *request) {
request.httpMethod = kJSHTTPMethodGET;
request.url = @"url";
// request.server = @"server";
// request.api = @"api";
request.parameters = @{@"param1": @"value1", @"param2": @"value2"};
request.headers = @{@"header1": @"value1"};
} onSuccess:^(id responseObject) {
NSLog(@"onSuccess: %@", responseObject);
} onFailure:^(NSError *error) {
NSLog(@"onFailure: %@", error);
} onFinished:^(id responseObject, NSError *error) {
NSLog(@"onFinished");
}];
[JSCenterManager sendRequest:^(JSRequestManager *request) {
request.url = @"url";
// request.server = @"server";
// request.api = @"api";
request.parameters = @{@"param1": @"value1", @"param2": @"value2"};
request.headers = @{@"header1": @"value1"};
} onSuccess:^(id responseObject) {
NSLog(@"onSuccess: %@", responseObject);
} onFailure:^(NSError *error) {
NSLog(@"onFailure: %@", error);
} onFinished:^(id responseObject, NSError *error) {
NSLog(@"onFinished");
}];
使用方法与上述类似, 不在赘述
[JSCenterManager sendBatchRequest:^(JSBatchRequestManager *batchRequest) {
JSRequestManager *request1 = [JSRequestManager request];
request1.url = @"url1";
...
JSRequestManager *request2 = [JSRequestManager request];
request2.url = @"url2";
...
[batchRequest.requestArray addObject:request1];
[batchRequest.requestArray addObject:request2];
} onSuccess:^(NSArray<id> *responseObjects) {
NSLog(@"onSuccess: %@", responseObjects);
} onFailure:^(NSArray<id> *errors) {
NSLog(@"onFaulure: %@", errors);
} onFinished:^(NSArray<id> *responseObjects, NSArray<id> *errors) {
NSLog(@"onFinished");
}];
[JSCenterManager sendChainRequest:^(JSChainRequestManager *chainRequest) {
[[[chainRequest onFirst:^(JSRequestManager *request) {
request.url = @"url1";
...
}] onNext:^(JSRequestManager *request, id responseObject, BOOL *sendNext) {
request.url = @"url2";
...
}] onNext:...];
} onSuccess:^(NSArray<id> *responseObjects) {
NSLog(@"onSuccess: %@", responseObjects);
} onFailure:^(NSArray<id> *errors) {
NSLog(@"onFailure: %@", errors);
} onFinished:^(NSArray<id> *responseObjects, NSArray<id> *errors) {
NSLog(@"onFinished");
}];
// `NSData` form data.
UIImage *image = [UIImage imageNamed:@"testImage"];
NSData *fileData1 = UIImageJPEGRepresentation(image, 1.0);
// `NSURL` form data.
NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Documents/testImage.png"];
NSURL *fileURL2 = [NSURL fileURLWithPath:path isDirectory:NO];
[JSCenterManager sendRequest:^(JSRequestManager *request) {
request.requestType = kJSRequestUpload;
request.server = @"server";
request.api = @"api";
[request addFormDataWithName:@"image"
fileName:@"temp.jpg"
mimeType:@"image/jpeg"
fileData:fileData1];
[request addFormDataWithName:@"image"
fileURL:fileURL2];
} onProgress:^(NSProgress *progress) {
if (progress) {
NSLog(@"onProgress: %f", progress.fractionCompleted);
}
} onSuccess:^(id responseObject) {
NSLog(@"onSuccess: %@", responseObject);
} onFailure:^(NSError *error) {
NSLog(@"onFailure: %@", error);
} onFinished:^(id responseObject, NSError *error) {
NSLog(@"onFinished");
}];
[JSCenterManager sendRequest:^(JSRequestManager *request) {
request.requestType = kJSRequestDownload;
request.url = @"http://example.com/v1/testDownFile.zip";
request.downloadSavePath = [NSHomeDirectory() stringByAppendingString:@"/Documents/"];
} onProgress:^(NSProgress *progress) {
if (progress) {
NSLog(@"onProgress: %f", progress.fractionCompleted);
}
} onSuccess:^(id responseObject) {
NSLog(@"onSuccess: %@", responseObject);
} onFailure:^(NSError *error) {
NSLog(@"onFailure: %@", error);
}];
当调用 [JSCenterManager sendRequest:...]
方法发送一个网络请求时, 该方法会返回一个用于唯一标识该请求对象的 identifier
(如果请求发送失败, 该值为 0
) , 在必要的时候, 你可以通过这个 identifier
来取消当前网络请求 (如果一个请求已经结束, 这时再用 identifier
来取消该请求时, 会直接忽略)
[JSCenterManager cancelRequest:identifier
onCancel:^(JSCenterManager *request) {
NSLog(@"onCancel");
}];
// 该方法会返回一个 BOOL 值用于表示当前网络是否可连接
[JSCenterManager isNetworkReachable];
// 该方法会返回一个当前网络的状态值, -1 表示 `Unknown`, 0 表示 `NotReachable, 1 表示 `WWAN`, 2 表示 `WiFi`
[[JSCoreManager sharedManager] networkReachabilityStatus];
详见 AFNetworkReachabilityManager.h
获取更多细节
在你的应用程序包里添加 (pinned) 相应的 SSL 证书做校验有助于防止中间人攻击和其他安全漏洞
非常方便的是, AFNetworking 的 AFSecurityPolicy
安全模块可以通过校验本地保存的证书或公钥帮助我们评估服务器是否可信任以及建立安全连接
我们在 JSCoreManager
中暴露了一个 AFHTTPSessionManager
对象叫 sessionManager
,
你可以通过修改该对象的 securityPolicy
类型,以开启 SSL Pinning 功能, 并把你们服务器对应的 .cer
证书或者公钥放到你的工程中
[JSCoreManager sharedManager].sessionManager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
详见 AFSecurityPolicy.h
获取更多细节
spirit-jsb, [email protected]
JSNetworking 遵循 MIT 开源许可证, 详情请查看 LICENSE 文件