POST_JSON
序列化:将字典或者数组 转换成二进制数据 准备发送给服务器。
反序列化:从服务器接收到 二进制数据 转换成 字典或者数组。
为什么要POST_JSON?
上传文件时,有时候希望传递一些附加信息给服务器,这时可以在上传文件的同事在POST过去这些附加信息。
例如:
上传照片时给图片的作者、名称、描述、地理位置等信息。
发微博时上传图片,还要附带微博内容、作者、地理位置等信息。
如何向服务器发送一个对象呢?即发送这个对象的描述信息。我们可以将描述信息定义成JSON字符串,字典或者数组,再将其序列化成二进制形式的JSON字符串,发送服务器,服务器接收到之后,可以直接反序列化成JSON字符串,字典或者数组。
当我们需要向服务器发送一个OC对象时,可以将OC对象转换成二进制形式的JSON字符串,因为服务器不认识OC对象,不能直接发送。
定义描述对象的信息
方式一 : 自定义JSON字符串
NSString *jsonStr = @"{"name":"zxc"}";
// 序列化
NSData *data1 = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];
[self postJSONWith:data1];
方式二 : 字典,字典描述对象比自定义JSON字符串好一点儿
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"zxc" forKey:@"name"];
// JSON序列化
NSData *data2 = [NSJSONSerialization dataWithJSONObject:dict options:0 error:NULL];
[self postJSONWith:data2];
方式三 : 数组,描述多个对象
NSDictionary *dict1 = [NSDictionary dictionaryWithObject:@"zxc" forKey:@"name"];
NSDictionary *dict2 = [NSDictionary dictionaryWithObject:@"zxj" forKey:@"name"];
NSArray *arr = @[dict1,dict2];
// JSON序列化
NSData *data3 = [NSJSONSerialization dataWithJSONObject:arr options:0 error:NULL];
[self postJSONWith:data3];
NSJSONSerialization 类
A class for converting JSON to Foundation objects and converting Foundation objects to JSON. NSJSONSerialization 类是一个负责 转换 JSON 和 Foundation 对象的类
An object that may be converted to JSON must have the following properties:
一个对象能够被转换成 JSON 必须符合以下条件:
Top level object is an NSArray or NSDictionary 顶级节点,必须是一个 NSArray or NSDictionary
All objects are NSString, NSNumber, NSArray, NSDictionary, or NSNull
所有的对象必须是 NSString, NSNumber, NSArray, NSDictionary, or NSNull
All dictionary keys are NSStrings
所有字典的 key 都必须是 NSString
NSNumbers are not NaN or infinity
NSNumber 不能为空或者无穷大
发送JSON的主方法
/// 发送JSON数据
-
(void)postJSONWith:(NSData *)data
{
// 获取URL
NSURL *url = [NSURL URLWithString:@"http://localhost/php/upload/postjson.php"];
// 创建请求
NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:url];
// 设置请求方法
requestM.HTTPMethod = @"POST";
// 设置请求体
requestM.HTTPBody = data;// 发送异步请求,请求自建服务器中的demo.json数据
[NSURLConnection sendAsynchronousRequest:requestM queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {// 判断链接是否错误 if (connectionError) { NSLog(@"链接错误 %@",connectionError); return; } // 检查响应体是否有错 NSHTTPURLResponse *HTTPURLResponse = (NSHTTPURLResponse *)response; if (HTTPURLResponse.statusCode == 200 || HTTPURLResponse.statusCode == 304) { // 反序列化 : 将二进制形式的字符串转换成OC对象 NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",str); } else { NSLog(@"服务器内部错误"); return; }
}];
}