比较AFN 与 Alamofire对 网络请求Content-Type的封装
引言
经常与服务器打交道的人知道:服务器需要通过请求头携带的Content-Type,识别请求数据是以何种方式编码,以便正确取值。常见的Content-Type和对应的编码格式有:
1、application/x-www-form-urlencoded 格式为:
GET,HEAD:http://www.baidu.com/query?name1=value&name2=value2
POST: HttpBody = name1=value&name2=value2
2、application/json 格式:
POST: HttpBody = {“name1”:”value1”,”name2”:”value2”}
3、multipart/form-data 格式:
POST: HttpBody = 以 boundary 分割成多个Data部分
4、text/xml 格式
POST:HttpBody = xml格式
AFN如何封装Conent-Type
1、创建时Manager时指定
manager.requestSerializer = [AFHTTPRequestSerializer serializer]; //默认 url encode
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.requestSerializer = [AFPropertyListRequestSerializer serializer];
2、使用AFURLSessionManager的API
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
completionHandler:(nullable void (^)(NSURLResponse *response,id _Nullable responseObject, NSError * _Nullable error))completionHandler
使用时需要自己拼接request 如
[mutableRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
Alamofire如何封装Content-Type
1、使用request API传入ParameterEncoding即可,默认Url Encode方式
public func request(_ url: URLConvertible,
method: HTTPMethod = .get,
parameters: Parameters? = nil,
encoding: ParameterEncoding = URLEncoding.default,
headers: HTTPHeaders? = nil) -> DataRequest { }
其中ParameterEncoding的值有 JSONEncoding、PropertyListEncoding、URLEncoding。
2、使用request,自定义Header
public func request(_ urlRequest: URLRequestConvertible) -> DataRequest
总结
相对来说使用swift的API比较方便处理Content-Type,可以针对某个请求做不同的编码处理。而使用AFN的时候,一般我们只会创建一个单例manager,处理相同的编码。当然你也可以选择特殊封装请求。