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 }

 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。