ContentType引发的思考

比较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格式

参考:四种常见的contentType

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的值有 JSONEncodingPropertyListEncodingURLEncoding

2、使用request,自定义Header

    public func request(_ urlRequest: URLRequestConvertible) -> DataRequest 

总结

相对来说使用swift的API比较方便处理Content-Type,可以针对某个请求做不同的编码处理。而使用AFN的时候,一般我们只会创建一个单例manager,处理相同的编码。当然你也可以选择特殊封装请求。

显示 Gitment 评论
0%