您的位置:首页 > 移动开发 > IOS开发

iOS开发 --- AFNetworking 进行封装(POST请求遇到的问题)

2018-01-05 16:19 495 查看
前言:

最近在写大量text文本上传功能,再用GET请求就会报404....,所以就要用POST请求了,因为GET请求对URL的长度有限制...

一,POST发送请求有两种形式:

1,发送纯文本的内容

2,发送的body部分带有文件(图片,音频或者二进制数据)

对应的Content - Type有两种:

1,application/x-www-form-urlencoded

2,multipart/form-data

今天主要讲的是POST发送请求的第一种方式:发送纯文本的内容

//发送一个POST请求
- (void)postTest:(NSString *)url
params:(NSDictionary *)params
success:(void (^)(id responseObject))success
failure:(void (^)(NSError *error))failure;


//发送一个POST请求
- (void)postTest:(NSString *)url
params:(NSDictionary *)params
success:(void (^)(id responseObject))success
failure:(void (^)(NSError *error))failure{
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]init];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", nil];
//默认:application/x-www-form-urlencoded
[manager.requestSerializer setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

manager.requestSerializer.timeoutInterval = outTime;
[manager POST:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
if (success) {
success(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (failure) {
failure(error);
}
}];
}


问题分析:
第1句代码:

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]init];


这样写的话后面第8句代码就要把url写全;

也可以写成

AFHTTPSessionManager *session = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://192.168.1.1/"]];
第2句代码:

manager.requestSerializer = [AFHTTPRequestSerializer serializer];
这句是发送请求的序列化,分3种编码格式:如果是POST方式,就用第一个AFHTTPRequestSerializer;

1,AFHTTPRequestSerializer:普通的http的编码格式就是
mid=10&method=userInfo&dateInt=20160818
,这种格式的。

2,AFJSONRequestSerialize:是json编码格式的,也就是编码成:  
{"mid":"11","method":"userInfo","dateInt":"20160818"}

3,AFPropertyListRequestSerializer:但是看介绍接编码成pislt格式的参数

第3句代码:

manager.responseSerializer = [AFHTTPResponseSerializer serializer];
这句是接收端的序列化,也有3中方式:

1,AFHTTPResponseSerializer:直接使用服务器应该返回的数据,不做任何解析,我们接收到数据自己做转换;

2,AFXMLParserResponseSerializer:告诉服务器以xml形式返回数据;

3,AFJSONResponseSerializer:以json形式返回数据,默认是该样式;

第5句代码:

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", nil];


第6句代码:

[manager.requestSerializer setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];


第7句代码:

设置请求超时时间;

manager.requestSerializer.timeoutInterval = outTime;
第8句代码:

发送请求

params:

[manager POST:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
if (success) {
success(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (failure) {
failure(error);
}
}];

参考文章:

1,专为新手写的:关于IOS HTTP请求的问题和常报的几个错,AFNetworking版
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: