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 }
时间: 2024-10-11 05:36:41

iOS开发——网络编程OC篇&(三)数据请求的相关文章

iOS开发——网络编程OC篇&数据请求总结

数据请求总结 1 //**************************************GET 2 //同步 3 /* 4 //第一步,创建URL 5 NSURL * url = [[NSURL alloc]initWithString:@"http://e.hiphotos.baidu.com/image/w%3D1366%3Bcrop%3D0%2C0%2C1366%2C768/sign=66f9b9980ef431adbcd2473a7d0097cc/08f790529822720

iOS开发——网络编程OC篇&(九)数据解析

数据解析 关于iOS开发的中数据解析的方法有两种JSON和XML,这里只做简单的介绍,会使用就可以了. JSON—— 关于JSON的解析经过很多爱好者的分析使用相同自带的还是最好的,不管是从使用的容易度还是性能方面 NSJSONSerialization 1 -(void)start 2 { 3 4 NSString* path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"json"]; 5

iOS开发——网络编程OC篇&Socket编程

Socket编程 一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象: 传输层.会话层.表示层和应用层则被称作主机层,是用户所面向和关心的内容. http协议   对应于应用层 tcp协议    对应于传输层 ip协议     对应于网络层 三者本质上没有可比性.  何况HTTP协议是基于TCP连接的. TCP/IP是传输层协议,主要

iOS开发——网络编程OC篇&数据解析总结

数据解析总结 1 //***************************************************XML 2 3 /** 4 NSXML 5 */ 6 /** 7 // 1. 开始解析XML文档 8 - (void)parserDidStartDocument: 9 10 // 2. 开始解析某个元素,会遍历整个XML,识别元素节点名称 11 - (void)parser:didStartElement:namespaceURI:qualifiedName:attrib

iOS开发——网络编程OC篇&总结

网络开发总结 一.一个HTTP请求的基本要素 1.请求URL:客户端通过哪个路径找到服务器 2.请求参数:客户端发送给服务器的数据 * 比如登录时需要发送的用户名和密码 3.返回结果:服务器返回给客户端的数据 * 一般是JSON数据或者XML数据 二.基本的HTTP请求的步骤(移动客户端)1.拼接"请求URL" + "?" + "请求参数" * 请求参数的格式:参数名=参数值 * 多个请求参数之间用&隔开:参数名1=参数值1&参数

iOS开发——网络编程OC篇&(十)NSURLConnection/NSSeccession

一.NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法.请求头.请求体.... (3)NSMutableURLRequest:NSURLRequest的子类 (4)NSURLConnection:负责发送请求,建立客户端和服务器的连接.发送NSURLRequest的数据给服务器,并收集来自服务器的响应数据 二.NSURLConnection的使用 1.简单说明 使用NSURL

iOS开发——网络编程OC篇&(一)XMPP简单介绍与准备

XMPP简单介绍与准备 一.即时通讯简单介绍 1.简单说明 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈的内容. 有许多的IM系统,如AOL IM.Yahoo IM. MSN以及QQ,它们最大的区别在于各自通讯协议的实现,所以即时通讯技术的核心在于它的传输协议. 协议用来说明信息在网络上如何传输,如果有了统一的传输协议,那么应当可以实现各个IM之间的直接通讯,为了创建即时通讯的统一标准,目前已经出现过

iOS开发——网络编程OC篇&(十二)AFN详解

AFN详解 众所周知,苹果搞的一套框架NSContention发送请求与接收请求的方式十分繁琐.操作起来很不方便.不仅要做区分各种请求设置各种不同的参数,而且还要经常在多线程里操作,同时还要对请求与返回的数据做各种序列化的操作,同时还要考虑请求数据的安全等一堆问题. 一.早前的几个网络框架 1.ASI框架: HTTP终结者.很牛, 但是有BUG, 已经停止更新. 2.MKNetworkKit (印度人写的). 3.AFN一直还在更新. AFNetworking的出现:MAC/iOS设计的一套网络

iOS开发——网络编程OC篇&(十一)ASI了解

ASI了解 关于AFI网络框架早在2011年就已经停止更新了,现在基本上没有公司在使用,除非一些大的公司会保留一些项目在使用,所以以后我吗一般都不会接触到活着使用这个框架,但是作为一个开发者,正是因为他这么好,而且之前那么火,必须要了解或者知道一些基本的原理, 一.发送请求的2个对象1.发送GET请求:ASIHttpRequest 2.发送POST请求:ASIFormDataRequest* 设置参数// 同一个key只对应1个参数值,适用于普通“单值参数”- (void)setPostValu