iOS开发——网络编程OC篇&(三)数据请求
一、GET请求和POST请求简单说明
创建GET请求
1 // 1.设置请求路径
2 NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];
3 NSURL *url=[NSURL URLWithString:urlStr];
4
5 // 2.创建请求对象
6 NSURLRequest *request=[NSURLRequest requestWithURL:url];
7
8 // 3.发送请求
服务器:
创建POST请求
1 // 1.设置请求路径
2 NSURL *URL=[NSURL URLWithString:@"http://192.168.1.53:8080/MJServer/login"];//不需要传递参数
3
4 // 2.创建请求对象
5 NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:URL];//默认为get请求
6 request.timeoutInterval=5.0;//设置请求超时为5秒
7 request.HTTPMethod=@"POST";//设置请求方法
8
9 //设置请求体
10 NSString *param=[NSString stringWithFormat:@"username=%@&pwd=%@",self.username.text,self.pwd.text];
11 //把拼接后的字符串转换为data,设置请求体
12 request.HTTPBody=[param dataUsingEncoding:NSUTF8StringEncoding];
13
14 // 3.发送请求
服务器:
二、比较
建议:提交用户的隐私数据一定要使用POST请求
相对POST请求而言,GET请求的所有参数都直接暴露在URL中,请求的URL一般会记录在服务器的访问日志中,而服务器的访问日志是黑客攻击的重点对象之一
用户的隐私数据如登录密码,银行账号等。
三、使用
1.通过请求头告诉服务器,客户端的类型(可以通过修改,欺骗服务器)
1 // 1.设置请求路径
2 NSURL *URL=[NSURL URLWithString:@"http://192.168.1.53:8080/MJServer/login"];//不需要传递参数
3
4 // 2.创建请求对象
5 NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:URL];//默认为get请求
6 request.timeoutInterval=5.0;//设置请求超时为5秒
7 request.HTTPMethod=@"POST";//设置请求方法
8
9 //设置请求体
10 NSString *param=[NSString stringWithFormat:@"username=%@&pwd=%@",self.username.text,self.pwd.text];
11 //把拼接后的字符串转换为data,设置请求体
12 request.HTTPBody=[param dataUsingEncoding:NSUTF8StringEncoding];
13
14 //客户端类型,只能写英文
15 [request setValue:@"ios+android" forHTTPHeaderField:@"User-Agent"];
服务器:
2.加强对中文的处理
问题:URL不允许写中文
在GET请求中,相关代码段打断点以验证。
在字符串的拼接参数中,用户名使用“文顶顶”.
转换成URL之后整个变成了空值。
提示:URL里面不能包含中文。
解决:进行转码
1 // 1.设置请求路径
2 NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];
3 //转码
4 urlStr= [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
5 NSURL *url=[NSURL URLWithString:urlStr];
6
7 // 2.创建请求对象
8 NSURLRequest *request=[NSURLRequest requestWithURL:url];
调试查看:
服务器:
下面是笔者学习的实力代码:
1 #pragma mark iOS开发请求方式 2 3 /** 4 * GET请求-----同步 5 */ 6 -(void)getSync 7 { 8 //拼接URL字符串 9 NSString *strUrl = [NSString stringWithFormat:@"http://localhost:8080/MJServer/login?username=%@&pwd=%@", self.name.text, self.pwd.text]; 10 11 //将中文转码 12 strUrl = [strUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 13 14 //获取URL 15 NSURL *url = [NSURL URLWithString:strUrl]; 16 17 //设置请求 18 NSURLRequest *request = [NSURLRequest requestWithURL:url]; 19 20 //发生GET同步请求(Sync) 21 NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 22 23 //解析JSON数据 24 NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; 25 26 NSString *error = dic[@"error"]; 27 /** 28 3> 请求结果:服务器会返回什么东西给客户端 29 {"error":"用户名不存在"} 30 {"error":"密码不正确"} 31 {"success":"登录成功"} 32 */ 33 if (error) { 34 [MBProgressHUD showError:error]; 35 } else { 36 NSString *success = dic[@"success"]; 37 [MBProgressHUD showSuccess:success]; 38 } 39 40 NSLog(@"%@", dic); 41 42 43 } 44 45 /** 46 * GET请求-----异步: 47 */ 48 -(void)getAsync 49 { 50 //拼接URL字符串 51 NSString *strUrl = [NSString stringWithFormat:@"http://localhost:8080/MJServer/login?username=%@&pwd=%@", self.name.text, self.pwd.text]; 52 53 //将中文转码 54 strUrl = [strUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 55 56 //获取URL 57 NSURL *url = [NSURL URLWithString:strUrl]; 58 59 //设置请求 60 NSURLRequest *request = [NSURLRequest requestWithURL:url]; 61 62 //发生GET同步请求(Sync) 63 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 64 if (connectionError || data == nil) { 65 [MBProgressHUD showError:@"请求失败"]; 66 return ; 67 } 68 //解析JSON数据 69 NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; 70 71 NSString *error = dic[@"error"]; 72 /** 73 3> 请求结果:服务器会返回什么东西给客户端 74 {"error":"用户名不存在"} 75 {"error":"密码不正确"} 76 {"success":"登录成功"} 77 */ 78 if (error) { 79 [MBProgressHUD showError:error]; 80 } else { 81 NSString *success = dic[@"success"]; 82 [MBProgressHUD showSuccess:success]; 83 } 84 85 86 NSLog(@"%@", dic); 87 }]; 88 89 90 } 91 92 /** 93 * POST请求-----同步:http://localhost:8080/MJServer/login ? 94 username=%E6%AF%8D%E9%B8%A1&pwd=1234 & 95 type=? 96 */ 97 -(void)postSync 98 { 99 //拼接URL字符串 100 NSString *strUrl = [NSString stringWithFormat:@"http://localhost:8080/MJServer/login"]; 101 102 //获取URL 103 NSURL *url = [NSURL URLWithString:strUrl]; 104 105 //设置请求 106 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 107 108 //请求方式 109 request.HTTPMethod = @"POST"; 110 111 //超时5秒 112 request.timeoutInterval = 5; 113 114 //请求体 115 NSString *param = [NSString stringWithFormat:@"username=%@&pwd=%@", self.name.text, self.pwd.text]; 116 117 //将中文转码(url中有中文的时候一定要使用这句) 118 param = [param stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 119 120 //设置请求体 121 request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding]; 122 123 //设置请求头信息 124 [request setValue:@"iPhone plus" forHTTPHeaderField:@"User-Agent"]; 125 126 //发生GET同步请求(Sync) 127 NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 128 129 //解析JSON数据 130 NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; 131 132 NSString *error = dic[@"error"]; 133 /** 134 3> 请求结果:服务器会返回什么东西给客户端 135 {"error":"用户名不存在"} 136 {"error":"密码不正确"} 137 {"success":"登录成功"} 138 */ 139 if (error) { 140 [MBProgressHUD showError:error]; 141 } else { 142 NSString *success = dic[@"success"]; 143 [MBProgressHUD showSuccess:success]; 144 } 145 146 NSLog(@"%@", dic); 147 } 148 149 150 /** 151 * POST请求-----异步 152 */ 153 -(void)postAsync 154 { 155 //在加载的时候添加一层蒙板 156 [MBProgressHUD showMessage:@"正在拼命加载中...."]; 157 158 //拼接URL字符串 159 NSString *strUrl = [NSString stringWithFormat:@"http://localhost:8080/MJServer/login"]; 160 161 //获取URL 162 NSURL *url = [NSURL URLWithString:strUrl]; 163 164 //设置请求 165 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 166 167 //请求方式 168 request.HTTPMethod = @"POST"; 169 170 //超时5秒 171 request.timeoutInterval = 5; 172 173 //请求体 174 NSString *param = [NSString stringWithFormat:@"username=%@&pwd=%@", self.name.text, self.pwd.text]; 175 /** 176 * 多个参数的时候 177 NSMutableString *param = [NSMutableString string]; 178 [param appendString:@"place=beijing"]; 179 [param appendString:@"&place=tianjin"]; 180 */ 181 182 //将中文转码(url中有中文的时候一定要使用这句) 183 param = [param stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 184 185 //设置请求体 186 request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding]; 187 188 //设置请求头信息 189 [request setValue:@"iPhone plus" forHTTPHeaderField:@"User-Agent"]; 190 191 //发生GET同步请求(Sync) 192 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 193 194 //加载完之后隐藏蒙板 195 [MBProgressHUD hideHUD]; 196 197 198 if (connectionError || data == nil) { 199 [MBProgressHUD showError:@"请求失败"]; 200 return ; 201 } 202 //解析JSON数据 203 NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; 204 205 NSString *error = dic[@"error"]; 206 /** 207 3> 请求结果:服务器会返回什么东西给客户端 208 {"error":"用户名不存在"} 209 {"error":"密码不正确"} 210 {"success":"登录成功"} 211 */ 212 if (error) { 213 [MBProgressHUD showError:error]; 214 } else { 215 NSString *success = dic[@"success"]; 216 [MBProgressHUD showSuccess:success]; 217 } 218 219 220 NSLog(@"%@", dic); 221 }]; 222 } 223 224 225 /** 226 * POST(异步)发送特殊数据,如:JSON 227 */ 228 -(void)postJSON 229 { 230 // 1.URL 231 NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/order"]; 232 233 // 2.请求 234 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 235 236 // 3.请求方法 237 request.HTTPMethod = @"POST"; 238 239 // 4.设置请求体(请求参数) 240 // 创建一个描述订单信息的JSON数据 241 NSDictionary *orderInfo = @{ 242 @"shop_id" : @"1243324", 243 @"shop_name" : @"啊哈哈哈", 244 @"user_id" : @"899" 245 }; 246 NSData *json = [NSJSONSerialization dataWithJSONObject:orderInfo options:NSJSONWritingPrettyPrinted error:nil]; 247 request.HTTPBody = json; 248 249 // 5.设置请求头:这次请求体的数据不再是普通的参数,而是一个JSON数据 250 [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 251 252 // 6.发送请求 253 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 254 if (data == nil || connectionError) return; 255 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; 256 NSString *error = dict[@"error"]; 257 if (error) { 258 [MBProgressHUD showError:error]; 259 } else { 260 NSString *success = dict[@"success"]; 261 [MBProgressHUD showSuccess:success]; 262 } 263 }]; 264 } 265 266 267 #pragma mark 还有一种使用代理的方式实现异步请求 268 269 /** 270 * 代理异步GET 271 */ 272 -(void)getAsyncDelegate 273 { 274 //拼接URL字符串 275 NSString *strUrl = [NSString stringWithFormat:@"http://localhost:8080/MJServer/login?username=%@&pwd=%@", self.name.text, self.pwd.text]; 276 277 //将中文转码 278 strUrl = [strUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 279 280 //获取URL 281 NSURL *url = [NSURL URLWithString:strUrl]; 282 283 //设置请求 284 NSURLRequest *request = [NSURLRequest requestWithURL:url]; 285 286 NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 287 if (connection) { 288 _mData = [NSMutableData new]; 289 } 290 291 292 } 293 294 /** 295 * 代理异步POST 296 */ 297 -(void)postAsyncDelegate 298 { 299 //在加载的时候添加一层蒙板 300 [MBProgressHUD showMessage:@"正在拼命加载中...."]; 301 302 //拼接URL字符串 303 NSString *strUrl = [NSString stringWithFormat:@"http://localhost:8080/MJServer/login"]; 304 305 //获取URL 306 NSURL *url = [NSURL URLWithString:strUrl]; 307 308 //设置请求 309 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 310 311 //请求方式 312 request.HTTPMethod = @"POST"; 313 314 //超时5秒 315 request.timeoutInterval = 5; 316 317 //请求体 318 NSString *param = [NSString stringWithFormat:@"username=%@&pwd=%@", self.name.text, self.pwd.text]; 319 /** 320 * 多个参数的时候 321 NSMutableString *param = [NSMutableString string]; 322 [param appendString:@"place=beijing"]; 323 [param appendString:@"&place=tianjin"]; 324 */ 325 326 //将中文转码(url中有中文的时候一定要使用这句) 327 param = [param stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 328 329 //设置请求体 330 request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding]; 331 332 //设置请求头信息 333 [request setValue:@"iPhone plus" forHTTPHeaderField:@"User-Agent"]; 334 335 //发生GET同步请求(Sync) 336 NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 337 if (connection) { 338 _mData = [NSMutableData new]; 339 } 340 341 } 342 343 #pragma mark 代理方法 344 345 //接收到响应数据 346 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 347 { 348 349 } 350 351 //接收到服务器传输数据的时候调用,此方法根据数据大小执行若干次 352 353 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 354 { 355 [_mData appendData:data]; 356 } 357 358 //数据传完之后调用此方法 359 360 -(void)connectionDidFinishLoading:(NSURLConnection *)connection 361 { 362 //解析数据 363 NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:_mData options:NSJSONReadingMutableContainers error:nil]; 364 365 NSLog(@"%@", dic); 366 367 //刷新表格 368 } 369 370 //网络请求过程中,出现任何错误(断网,连接超时等)会进入此方法 371 372 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 373 { 374 NSLog(@"%@", [error localizedDescription]); 375 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。