HTTP/1.1协议规定的HTTP请求方法有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 这几种。
其中POST请求常用以下几种方式
1、application/x-www-form-urlencoded 格式的POST请求
2、multipart/form-data 格式的POST请求
3、application/json 格式的POST请求
4、application/xml 、application/javascript、text/plain 等
在开发中,前后端发送和接收数据的格式,必须是统一的。否则就会造成,后端收不到前端的请求或前端无法解析后端的数据。
对于请求格式的统一,最常用的就是前端用JSON格式的POST, 后端用JSON数据返回。
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//申明返回的结果是json类型
manager.responseSerializer = [AFJSONResponseSerializer serializer];
//申明请求的数据是json类型
manager.requestSerializer=[AFJSONRequestSerializer serializer];
//如果报接受类型不一致请替换一致text/html或别的
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
//传入的参数
NSDictionary *parameters = @{@"1":@"XXXX",@"2":@"XXXX",@"3":@"XXXXX"};
//你的接口地址
NSString *url=@"http://xxxxx";
//发送请求
[manager POST:url parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
我们项目本来是用 application/json格式的POST请求,也是最常用的POST的JSON请求,请求、回调、解析一切顺风顺水,各自安好。
新项目立项后,后台重新搭建了新的PHP框架,把http的POST的请求,改成了原生表单形式接收。
这就导致,传过去的json, 后台解析不了,回调提示参数为空。
此时的解决方法是,在AFNet里面重置请求的Content-Type。
[_manager.requestSerializer setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
并且关闭 JSON的请求序列化
// _manager.requestSerializer = [AFHTTPRequestSerializer serializer]; //请求序列化
// _manager.requestSerializer = [AFJSONRequestSerializer serializer];