IOS-网络(HTTP请求、同步请求、异步请求、JSON解析数据)

时间:2022-06-03 16:23:16
 //
// ViewController.m
// IOS_0129_HTTP请求
//
// Created by ma c on 16/1/29.
// Copyright © 2016年 博文科技. All rights reserved.
// #import "ViewController.h"
#import "MBProgressHUD+MJ.h" @interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *textName;
@property (weak, nonatomic) IBOutlet UITextField *textPassword; - (IBAction)btnlogin; @end @implementation ViewController
/*
1.常见的发送HTTP请求的方案:
1>苹果原生自带的
NSURLConnection:用法简单,最经典,最直接
NSURLSession:功能比NSURLConnection强大
CFNetwork:NSURL底层,纯C语言
2>第三方框架
ASIHttpRequest:“HTTP终结者”,功能及其强大,可惜停止更新
AFNetWorking:简单易用,提供基本够用的常用功能,维护者多
MKNetWorkKit:简单易用,维护者使用者少
3>建议
为了提高开发效率,企业开发用的基本是第三方框架 2.常用类
1>NSURL:请求地址
2>NSURLRequest:一个NSURLRequest对象代表一个请求 - 包含信息有:
a.一个NSURL对象
b.请求方法、请求头、请求体
c.请求超时
3>NSMutableURLRequest:
4>NSURLConnection - 负责发送请求,建立客户端与服务器的连接
发送NSURLRequest的数据给服务器,并收来自服务器响应的数据 3.NSURLConnection使用步骤:
1>创建NSURL对象,并设置请求路径
2>传入一个NSURL对象创建NSURLRequest对象,设置请求头和请求体
3>使用NSURLConnection发送NSURLRequest
*/ - (void)viewDidLoad {
[super viewDidLoad]; self.view.backgroundColor = [UIColor groupTableViewBackgroundColor];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
} - (IBAction)btnlogin { NSString *usernameText = self.textName.text;
if (usernameText.length == ) {
[MBProgressHUD showError:@"请输入账号"];
return;
}
self.textPassword.secureTextEntry = YES;
NSString *password = self.textPassword.text;
if (password.length == ) {
[MBProgressHUD showError:@"请输入密码"];
return;
}
NSLog(@"发送数据给服务器"); /*
接口文档:定义描述服务器端的请求接口
1>请求路径URL:客户端应该请求哪个路径
2>请求参数:客户端要发给服务器的数据
3>请求结果:服务器要返回什么给客户端
*/ //创建一个NSURL:请求路径
NSString *strURL = [NSString stringWithFormat:@"http://localhost:8080/MJServer/login?username=%@&pwd=%@",usernameText,password];
NSURL *url = [NSURL URLWithString:strURL];
//创建一个请求
NSURLRequest *request = [NSURLRequest requestWithURL:url]; //同步请求
[self sendSyncWithRequest:request];
//异步请求
[self sendAsyncWithRequest:request]; }
//异步请求
- (void)sendAsyncWithRequest:(NSURLRequest *)request
{
NSOperationQueue *queue = [NSOperationQueue mainQueue]; [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//这个block会在请求完毕的时候自动调用
if (connectionError || data == nil) {
[MBProgressHUD showError:@"请求失败"];
return;
}
//解析服务器返回的JSON数据
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
NSString *error = dict[@"error"];
if (error) {
[MBProgressHUD showError:error];
}
else{
NSString *success = dict[@"success"];
[MBProgressHUD showSuccess:success];
}
}];
} //同步请求
- (void)sendSyncWithRequest:(NSURLRequest *)request
{
//发送用户名和密码给服务器(HTTP协议)
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
/*
JSON
1>JSON是一种轻量级的数据格式,一般用于数据交互
服务器返回给客户端的数据一般都是JSON格式或者XML格式
标准的JSON合适注意点:key必须用双引号 2>要想从JSON中挖出具体数据得对JSON进行解析
JSON OC
{}-----------NSDictonary
[]-----------NSArray
" "-----------NSString
数字-----------NSNumber 3>JSON解析方案
第三方框架:JSONKit、SBJson、TouchJSON(性能从左到右,越差)
苹果原生(自带):NSJSONSerialization(性能最好)
4>JSON数据转-->OC对象
+ (nullable id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
5>OC对象-->JSON数据
+ (nullable NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
*/
//解析服务器返回的JSON数据
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
NSString *error = dict[@"error"];
if (error) {
[MBProgressHUD showError:error];
}
else{
NSString *success = dict[@"success"];
[MBProgressHUD showSuccess:success];
} }
@end