## 网络请求
### 简介
天马SDK基于AFNetworking封装了一套基础网络请求工具类,其中除了处理基本的网络请求以外,为了网络请求的安全性,还处理了https、加密等功能。开发者在进行组件开发时,可以基于我们提供的工具类进行开发,如需自定义,则需满足我们的开发规范要求。
### 使用方法:
1.天马工厂框架添加了加密请求头,如果对加密请求头没有特殊要求,可以直接使用下列第一二种方法,进行网络请求,否则请使用第三四种进行加密请求头配置:
```
#import <TMSDK/TMBaseNetworking.h>
/**
post请求
@param urlString 请求地址
@param paraments 请求参数
@param successBlock 成功回调
@param failureBlock 失败回调
@return 请求工具类
*/
+(TMBaseNetworking *)tm_postWithUrlString:(NSString *)urlString
withParaments:(nullable id)paraments
withSuccessBlock:( TMRequestSuccessBlock)successBlock
withFailureBlock:( TMRequestFailureBlock)failureBlock;
/**
get请求
@param urlString 请求地址
@param paraments 请求参数
@param successBlock 成功回调
@param failureBlock 失败回调
@return 请求工具类
*/
+(TMBaseNetworking *)tm_getWithUrlString:(NSString *)urlString
withParaments:(nullable id)paraments
withSuccessBlock:( TMRequestSuccessBlock)successBlock
withFailureBlock:( TMRequestFailureBlock)failureBlock;
/**
post请求
@param urlString 请求地址
@param paraments 请求参数
@param encryptionTool 加密工具,其中涉及加密参数及加密请求头。如果没有特殊需求请传入空,工具类会按照默认处理。
@param successBlock 成功回调
@param failureBlock 失败回调
@return 请求工具类
*/
+(TMBaseNetworking *)tm_postWithUrlString:(NSString *)urlString
withParaments:(nullable id)paraments
encryptionTool:(nullable TMEncryptionTool *)encryptionTool
withSuccessBlock:( TMRequestSuccessBlock)successBlock
withFailureBlock:( TMRequestFailureBlock)failureBlock;
/**
get请求
@param urlString 请求地址
@param paraments 请求参数
@param encryptionTool 加密工具,其中涉及加密参数及加密请求头。如果没有特殊需求请传入空,工具类会按照默认处理。
@param successBlock 成功回调
@param failureBlock 失败回调
@return 请求工具类
*/
+(TMBaseNetworking *)tm_getWithUrlString:(NSString *)urlString
withParaments:(nullable id)paraments
encryptionTool:(nullable TMEncryptionTool *)encryptionTool
withSuccessBlock:( TMRequestSuccessBlock)successBlock
withFailureBlock:( TMRequestFailureBlock)failureBlock;
/**
批量上传图片
@param images 成功回调
@param success 失败回调
@param failed 请求工具类
*/
+ (void)tm_uploadImageWithImages:(NSArray *)images
success:(void(^)(NSArray *imageUrls))success
failed:(TMRequestFailureBlock)failed;
/**
批量上传视频文件
@param videos 成功回调
@param success 失败回调
@param failed 请求工具类
*/
+ (void)tm_uploadVideoWithVideos:(NSArray *)videos
success:(void(^)(NSArray *videoUrls))success
failed:(TMRequestFailureBlock)failed;
```
例如用户可以像下面这样直接发起网络请求:
```
[TMBaseNetworking tm_getWithUrlString:@"/Member/Article/getAboutUsArticle.html" withParaments:nil withSuccessBlock:^(id _Nonnull data, TMEncryptionTool * _Nonnull encryptionTool) {
NSLog(@"网络请求成功:%@", [data valueForKey:@"data"]);
} withFailureBlock:^(NSString * _Nonnull error, id _Nonnull data) {
NSLog(@"网络请求失败:%@", error);
}];
```
2.如果开发者有自己的网络请求设置,可以初始化TMBaseNetworking对象,并配置相应的请求参数后发起网络请求,如:请求方法、参数、序列化、请求头等配置
```
#import <TMSDK/TMBaseNetworking.h>
TMBaseNetworking *baseNetworking = [[TMBaseNetworking alloc] init];
baseNetworking.requestMethod = TMRequestMethodGET;
baseNetworking.requestURLPath = @"/Member/Article/getAboutUsArticle.html";
baseNetworking.requestTimeoutInterval = 5.0f;
[baseNetworking startCompletionBlockWithSuccess:^(id _Nonnull data, TMEncryptionTool * _Nonnull encryptionTool) {
NSLog(@"网络请求成功:%@", [data valueForKey:@"data"]);
} failure:^(NSString * _Nonnull error, id _Nonnull data) {
NSLog(@"网络请求失败:%@", error);
}];
[baseNetworking startRequest];
```
3.天马SDK的网络请求工具类提供了和后台对应的加解密方法,如果开发者需要对自己的某些参数进行加解密,可以调用天马工场的方法进行加解密,需要注意的是,客户端的加密需要调用后端解密方法解密,后端的加密需要调用客户端解密方法进行解密:
```
TMEncryptionTool *tool = [[TMEncryptionTool alloc] init];
NSString *content = @"1234567890qwertyuiop";
NSString *encryptionContent = [tool tm_encryptionWithContent:content];
//NSString *decryptionContent = [tool tm_decryptionWithContent:content];
NSLog(@"待加密内容:%@", content);
NSLog(@"加密后内容:%@", encryptionContent);
//NSLog(@"解密后内容:%@", decryptionContent);
```
4.如果以上不满足业务需求,需要自定义网络请求,则需要满足下列网络请求规范:
1).兼容https和http:我们提供了TMCertificateConfig配置文件来表示是否启用https以及相关情况,开发者需要依据TMCertificateConfig配置文件做相应处理。
```
#import <TMSDK/TMCertificateConfig.h>
/**
证书相关配置信息:
1.如果是开启了https,则只支持双向认证。
2.在进行网络请求时:是否针对服务端进行域名和无效证书验证可以通过“validatesDomainName”和“allowInvalidCertificates”进行配置;在进行客户端证书校验时,可以通过“certificateData”和“certificatePassword”获取证书数据及密码
*/
@interface TMCertificateConfig : NSObject
/**
是否是https请求
*/
@property (nonatomic, assign, readonly) BOOL isHttpsRequest;
/**
https证书类型, 暂时只支持AFSSLPinningModeNone这一种类型,是否验证域名和是否允许无效证书,请通过下列对应属性获取
*/
**@property (nonatomic, assign, readonly) AFSSLPinningMode pinningMode;
/**
https证书数据
*/
@property (nonatomic, strong, readonly) id certificateData;
/**
https证书密码
*/
@property (nonatomic, strong, readonly) NSString *certificatePassword;
/**
是否允许无效证书
*/
@property (nonatomic, assign, readonly) BOOL allowInvalidCertificates;
/**
是否需要验证域名
*/
@property (nonatomic, assign, readonly) BOOL validatesDomainName;
+ (TMCertificateConfig *)instance;
@end
```
2).添加加密头文件到网络请求头中:我们提供了TMEncryptionTool工具类,主要是用来提供加密头,以及根据业务需求对关键字段进行加解密
```
#import <TMSDK/TMEncryptionTool.h>
@interface TMEncryptionTool : NSObject
/**
是否加密头文件,默认为YES,如无特殊需求,不建议修改
*/
@property (nonatomic, assign) BOOL isEncryptionHead;
/**
加密头文件
*/
@property (nonatomic, strong, readonly) NSDictionary<NSString *, NSString *> * encryptHeader;
/**
生成加密请求头
该加密请求头会用在请求头里和加解密,如无特殊需求,不必调用该方法
@param isEncryption 请求头是否加解密,如果没有特殊需求,请传入YES
*/
- (void)tm_generateGloadHeaderWithIsEncryption:(BOOL)isEncryption;
/**
利用加密头文件进行加密
@param content 需要加密的内容
@return 返回加密后的内容,如果返回nil表示加密失败
*/
- (NSString *)tm_encryptionWithContent:(NSString *)content;
/**
利用加密头文件进行解密
@param content 需要解密的内容
@return 返回解密后的内容,如果返回nil表示解密失败
*/
- (NSString *)tm_decryptionWithContent:(NSString *)content;
@end
```
5. 如果使用TMViewController 打开h5页面,则不需要关心证书这一块,如果是自定义webview打开h5,则需要处理证书这一块。
6. 天马已经在SDK中针对SDWebImage框架做了处理,可以正常加载图片,如果使用其他库或者其他方法加载网络图片,则需要自己处理
备注:具体的相关使用方法,可以见demo。