AFNetworking 3.0 源码解读(三)之 AFURLRequestSerialization
Serialization
这个是 我封装的网络请求的demo:https://github.com/wwpeter/WWNetWorking ,实现一个接口一个类。
/* post body里面上传json */
- (NSURLRequest *)generateBodyPOSTRequestWithServiceIdentifier:(NSString *)serviceIdentifier
requestParams:(NSDictionary *)requestParams
methodName:(NSString *)methodName;
- (NSURLRequest *)generateBodyPOSTRequestWithServiceIdentifier:(NSString *)serviceIdentifier
requestParams:(NSDictionary *)requestParams
methodName:(NSString *)methodName {
AZService *service = [[AZServiceFactory sharedInstance] serviceWithIdentifier:serviceIdentifier];
NSString *signature = [AZSignatureGenerator signPostWithApiParams:requestParams privateKey:service.privateKey publicKey:service.publicKey];
NSString *urlString = [NSString stringWithFormat:@"%@%@", service.apiBaseUrl, methodName];
if (signature != nil && signature.length > 0) {
urlString = [NSString stringWithFormat:@"%@%@/%@?api_key=%@&sig=%@&%@", service.apiBaseUrl, service.apiVersion, methodName, service.publicKey, signature, [[AZCommonParamsGenerator commonParamsDictionary] AZ_urlParamsStringSignature:NO]];
}
NSString *jsonStr = [self convertToJsonData:requestParams];
NSData *data = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];
NSMutableURLRequest *request = [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:urlString parameters:nil error:nil];
request.timeoutInterval = 30.0;
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:data];
// NSURLRequest *request = [self.httpRequestSerializer requestWithMethod:@"POST" URLString:urlString parameters:requestParams error:NULL];
// request.requestParams = requestParams;
[AZLogger logDebugInfoWithRequest:request apiName:methodName service:service requestParams:requestParams httpMethod:@"POST"];
return request;
}
url编码也是(percentcode 百分号编码)
FOUNDATION_EXPORT NSString * AFPercentEscapedStringFromString(NSString *string);
这里值得注意的是AFPercentEscapedStringFromString的实现中 :
1. 字符串需要经过过滤 ,过滤法则通过 NSMutableCharacterSet 实现。添加规则后,只对规则内的因子进行编码。
2. 为了处理类似emoji这样的字符串,rangeOfComposedCharacterSequencesForRange 使用了while循环来处理,也就是把字符串按照batchSize分割处理完再拼回。
看序列化的源码:
成分为4个部分: 1.初始边界 2.body头 3.body 4.结束边界。 下边就会用着这些知识。
先介绍body部分:
看着个body类的声明就能够知道body包含的所有信息,这些信息也和例子中的body的4大组成部分息息相关。
学习的结果:
- 通过一个协议来得到不同转换的结果。
- 知道了AFNetworking响应结果支持的各种类型。
- 大体了解了NSIndexSet的使用方法
- 如果创建一个NSError 和 带有优先错误的NSUnderlyingErrorKey
- 服务器返回的图片是压缩格式,要进行解压
- 使用images来实现gif效果