网络请求的步骤:
get请求:
#pragma mark - 这是私有方法,尽量不要再方法中直接使用属性,因为一般来说属性都是和界面关联的,我们可以通过参数的方式来使用属性 #pragma mark Get登录方法 - (void)loginWithGet:(NSString *)name pwd:(NSString *)pwd { //1确定地址NSURL NSString *urlString = [NSString stringWithFormat:@"www.baidu.com?username=%@&password=%@", name, pwd]; NSLog(@"%@",urlString); //url中,如果包含中文字符需要转换成带百分号的格式,提供给服务器解码(如果服务器用的是utf-8)。 urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSLog(@"%@",urlString); NSURL *url = [NSURL URLWithString:urlString]; //2建立请求NSURLRequest NSURLRequest *request = [NSURLRequest requestWithURL:url]; //3建立并启动连接NSRULConnection NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self]; [conn start]; //启动连接,这是网络请求已经发生了。这是一个异步连接请求,,请求发送出去以后,就交由代理处理。 //服务器通知准备,准备中转数据 self.serverData = [NSMutableData data]; }
post请求:
- (void)login { NSLog(@"come here"); NSString *userName = self.nameTextField.text; NSString *pwd = self.passwordTextField.text; //[self loginWithGet:userName pwd:pwd]; //用get的方式调用 //上面一行是get方式,下面是post方式。 //1确定地址NSURL NSString *urlString = [NSString stringWithFormat:@"www.baidu.com"]; NSURL *url = [NSURL URLWithString:urlString]; //2建立请求NSMutableURLRequest(post需要用这个) NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; //1)post请求方式,网络请求默认是get方法,所以如果我们用post请求,必须声明请求方式。 [request setHTTPMethod:@"POST"]; //2)post请求的数据体,post请求中数据体时,如果有中文,不需要转换。因为ataUsingEncoding方法已经实现了转码。 NSString *bodyStr = [NSString stringWithFormat:@"username=%@&password=%@", userName, pwd]; //将nstring转换成nsdata NSData *body = [bodyStr dataUsingEncoding:NSUTF8StringEncoding]; NSLog(@"body data %@", body); [request setHTTPBody:body]; //3建立并启动连接NSRULConnection NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self]; [conn start]; //启动连接,这是网络请求已经发生了。这是一个异步连接请求,,请求发送出去以后,就交由代理处理。 //服务器通知准备,准备中转数据 self.serverData = [NSMutableData data]; }
//4通过代理方法处理网络请求,遵守协议 #pragma mark 网络数据处理代理,总共有五个代理方法 #pragma mark 代理方法1 接受到服务器的响应,服务器要传数据了,客户端做好接收准备 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { } #pragma mark 代理方法2 接收服务器传输的数据,可能会多次执行 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { //对每次传输的数据进行拼接,需要中转数据 [self.serverData appendData:data]; } #pragma mark 代理方法3 接收数据完成,做后续处理 - (void)connectionDidFinishLoading:(NSURLConnection *)connection { //对方法2拼接的数据,做后续处理。 NSString *str = [[NSString alloc] initWithData:self.serverData encoding:NSUTF8StringEncoding]; //对服务器返回的字符串进行处理。 //1 从str中找出的用户名所在的位置 NSRange range = [str rangeOfString:@"用户名"]; //nsrange存放查找到的字符串(用户名)的位置和长度 NSLog(@"%@", NSStringFromRange(range)); NSString *msg = nil; if (range.location > 0) { //2曲用户名后面的字符串,一直到末尾 NSString *name = [str substringFromIndex:(range.location +range.length)]; NSLog(@"%@",name); //3欢迎归来 msg= [NSString stringWithFormat:@"欢迎欢迎:%@", name]; }else { msg = @"用户名或者密码错误,请重试!"; } NSLog(@"%@", str); //提示用户登录成功 UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:msg delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil]; [alertView show]; //清空数据 self.serverData = nil; } #pragma mark 代理方法4 f服务器请求失败,原因很多(w网络环境等等); -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"网络连接请求错误%@",error.localizedDescription); //本地化的错误信息描述。 } #pragma mark d代理方法5 向服务器发送数据,次方法仅适用于post,尤其上传文件。 /* 第一个参数是连接,第二个参数是发送的数据体,第三个表示整体要写的数据,第四个是表示预期要写的数据。服务器通过这些值知道这次传了多少,已经传了多少,预期总共要穿多少 */ - (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite { NSLog(@"发送数据给服务器"); } @end