前言:
最近在写大量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句代码:
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版