网络请求包括GET.POST两种方式,其步骤为:1>获取URL。 2>获取请求。 3>创建链接。 4>返回数据(代理)。
1>获取URL。
1
2
3
4
|
NSString *urlStr=@
"http://api.zbw.vc/api/vip/GetPhonePadTagMsg"
;
//当参数为中文时,用UTF8编码
//urlStr=[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url=[NSURL URLWithString:urlStr];
|
2>获取请求。
1
|
NSURLRequest *request=[NSURLRequest requestWithURL:url];
|
默认get方法的参数只需要URL拼接。
当创建post方法的时候,对request进行如下操作
1
2
3
4
5
|
NSData *data=[dataStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
[request setHTTPMethod:@
"POST"
];
[request setTimeoutInterval:
5.0
];
|
3>创建链接。
此时,创建的 代理为本类,所以该类必须继承协议
1
|
NSURLConnection *conn=[NSURLConnection connectionWithRequest:request delegate:self];
|
4>返回数据(代理)。实现代理必须实现如下方法
1
2
3
4
5
6
7
8
|
-(
void
)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
//重复调用,返回数据处理
-(
void
)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
//返回数据结束
-(
void
)connectionDidFinishLoading:(NSURLConnection *)connection
//发生错误处理方法
-(
void
)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
|
1.同步>>
NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:&resp error:&error];
2.异步>>
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(block)];
具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
@interface
CSZViewController ()
@property
(nonatomic,strong) NSMutableData *mutableData;
@end
@implementation
CSZViewController
- (
void
)viewDidLoad
{
[
super
viewDidLoad];
}
- (NSURLRequest *)getRequest {
NSString *urlStr=@
"http://api.zbw.vc/api/vip/GetPhonePadTagMsg"
;
//当参数为中文时,用UTF8编码
//urlStr=[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url=[NSURL URLWithString:urlStr];
NSURLRequest *request=[NSURLRequest requestWithURL:url];
return
request;
}
- (IBAction)getLogin {
NSURLRequest *request = [self getRequest];
NSURLConnection *conn=[NSURLConnection connectionWithRequest:request delegate:self];
[conn start];
}
- (NSMutableURLRequest *)getAsyncRequest {
NSString *urlStr=@
"http://api.zbw.vc/api/Vip/PostUserInfo"
;
NSURL *url=[NSURL URLWithString:urlStr];
NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
NSString *dataStr=[NSString stringWithFormat:@
"UserName=%@&LoginPwd=%@"
,self.QQField.text,self.pwdField.text];
NSData *data=[dataStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
[request setHTTPMethod:@
"POST"
];
[request setTimeoutInterval:
5.0
];
return
request;
}
- (IBAction)postLogin {
[UIApplication sharedApplication].networkActivityIndicatorVisible=YES;
NSMutableURLRequest *request = [self getAsyncRequest];
NSURLConnection *conn=[NSURLConnection connectionWithRequest:request delegate:self];
[conn start];
}
-(
void
)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@
"%@"
,@
"网络返回数据开始"
);
}
-(
void
)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
if
(_mutableData==nil) {
_mutableData=[NSMutableData data];
}
[_mutableData appendData:data];
}
-(
void
)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
_mutableData=nil;
}
-(
void
)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSString *str=[[NSString alloc] initWithData:_mutableData encoding:NSUTF8StringEncoding];
NSLog(@
"%@"
,str);
if
(_mutableData!=nil) {
_mutableData=nil;
}
[UIApplication sharedApplication].networkActivityIndicatorVisible=NO;
}
- (IBAction)clickSync {
NSURLRequest *request = [self getRequest];
NSURLResponse *resp=nil;
NSError *error=nil;
NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:&resp error:&error];
if
(error!=nil) {
NSLog(@
"%@"
,error.localizedDescription);
return
;
}
if
(data!=nil) {
//解码
NSString *respStr=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@
"%@"
,respStr);
}
else
{
NSLog(@
"获取不到网络数据"
);
}
}
- (IBAction)clickAsync {
NSURLRequest *request = [self getAsyncRequest];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if
(connectionError!=nil) {
NSLog(@
"%@"
,connectionError.localizedDescription);
}
else
if
(response!=nil) {
//解码
NSString *res=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@
"%@"
,res);
}
else
{
NSLog(@
"获取不到网络数据"
);
}
}];
}
@end
一、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]; |