AFNetworking 3.0 源码解读(三)之 AFURLRequestSerialization

Serialization

这个是请求类的配置,平时我们用AFN,肯定也都是封装起来的,这个其实我们也是封装在请求配置里面的。

这个是 我封装的网络请求的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效果


猜你喜欢

转载自blog.csdn.net/super_man_ww/article/details/79455378