[iOS 多线程 & 网络 - 2.0] - 发送接收 服务器信息
GET
GET的语义是获取指定URL的资源
将数据按照variable=value的形式,添加到action所指向的URL后面,并且两者使用"?"连接,各变量之间使用"&"连接
貌似不安全,因为在传输过程中,数据被放在请求的URL中

POST的语义是向指定URL的资源添加数据
将数据放在数据体中,按照变量和值相对应的方式,传递到action所指向URL
所有数据对用户来说不可见
可以传输大量数据,上传文件只能使用Post

默认为GET请求
对于POST请求,需要创建请求的数据体
利用URLConnection发送网络请求(建立连接)
获得结果
NSURLConnection提供了两个静态方法可以直接以同步或异步的方式向服务器发送网络请求
同步请求:
sendSynchronousRequest:returningResponse:error:
异步请求:
sendAsynchronousRequest:queue: completionHandler:
服务器开始返回数据,准备工作
(void)connection:didReceiveResponse:
收到服务器返回的数据,本方法会被调用多次
- (void)connection:didReceiveData:
数据接收完毕,做数据的最后处理
(void)connectionDidFinishLoading:
网络连接错误
- (void)connection:didFailWithError:

().使用同步方法发送get请求(不常用)
/** 发送get消息 */
- (void) testGet {
NSString *requestStr = [NSString stringWithFormat:@"http://192.168.0.21:8080/MyTestServer/login?user=%@&password=%@", self.userField.text, self.passwordField.text]; NSURL *url = [NSURL URLWithString:requestStr]; // 默认就是get请求
NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 使用同步方法发送请求
[self sendSynRequest:request];
} /** 同步发送请求 */
- (void) sendSynRequest:(NSURLRequest *) request {
// 同步发送信息
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; [self dealWithResponseData:data];
} /** 处理返回数据 */
- (void) dealWithResponseData:(NSData *) data {
// 解析数据
if (data) { // 得到返回数据
// 解除屏幕锁
[MBProgressHUD hideHUD]; // 解析json数据
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; // 处理返回的数据
NSString *result = dict[@"success"];
if (result) {
[MBProgressHUD showSuccess:result];
} else {
result = dict[@"error"];
if (result) {
[MBProgressHUD showError:result];
}
}
} else {
[MBProgressHUD showError:@"网络繁忙,请稍后再试~"];
}
}
/** 异步发送请求 */
- (void) sendAsynRequest:(NSURLRequest *) request {
NSOperationQueue *queue = [NSOperationQueue mainQueue];
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { [self dealWithResponseData:data];
}];
}
@interface ViewController () <NSURLConnectionDataDelegate>
/** 使用start & 代理发送、处理异步请求 */
- (void) sendAsynRequestWithDelegate:(NSURLRequest *) request {
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
[connection start];
}
#pragma mark - NSURLConnectionDataDelegate 代理方法
/** 收到服务器回应 */
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSLog(@"didReceiveResponse");
self.data = [NSMutableData data];
} /** 接收到的数据,会调用多次,数据被分割接收 */
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
NSLog(@"didReceiveData");
[self.data appendData:data];
} /** 接收数据完毕 */
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSLog(@"connectionDidFinishLoading");
[self dealWithResponseData:self.data];
}
#pragma mark - post
- (void) testPost {
NSString *requestStr = [NSString stringWithFormat:@"http://192.168.0.21:8080/MyTestServer/login"];
NSURL *url = [NSURL URLWithString:requestStr]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.timeoutInterval = ; // 设置为post方式请求
request.HTTPMethod = @"POST"; // 设置请求头
[request setValue:@"ios" forHTTPHeaderField:@"User-Agent"]; // 设置请求体
NSString *param = [NSString stringWithFormat:@"user=%@&password=%@", self.userField.text, self.passwordField.text];
request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding]; // 发送请求
// 使用主线程来处理UI刷新
NSOperationQueue *queue = [NSOperationQueue mainQueue];
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
[self dealWithResponseData:data];
}]; }
// 使用可变request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 设置请求超时时间
request.timeoutInterval = ;
NSString *requestStr = [NSString stringWithFormat:@"http://192.168.0.21:8080/MyTestServer/login?user=%@&password=%@", self.userField.text, self.passwordField.text]; // 由于url不能传送中文,所以需要转码
requestStr = [requestStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[iOS 多线程 & 网络 - 2.0] - 发送接收 服务器信息的更多相关文章
- [iOS 多线程 & 网络 - 3.0] - 在线动画Demo
A.需求 所有数据都从服务器下载 动画列表包含:图片.动画名标题.时长副标题 点击打开动画观看 code source: https://github.com/hellovoidworld/Vid ...
- iOS多线程与网络开发之发送接收server信息
郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. (1).使用同步方法发送get请求(不经常使用) 2 /** 发送get消息 */ 3 - (void) testGet { 4 NSString *r ...
- [iOS 多线程 & 网络 - 1.0] - 多线程概述
A.进程 什么是进程进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过"活 ...
- [iOS 多线程 & 网络 - 4.0] - AFN框架简单使用
A.AFN基本知识 1.概念 AFNetworking 是对NSURLConnection的封装 运行效率没有ASI高(因为ASI基于CFNetwork),但是使用简单 AFN支持ARC B. ...
- [iOS 多线程 & 网络 - 2.4] - 大文件下载 (边下边写/暂停恢复下载/压缩解压zip/多线程下载)
A.需求 边下边写入硬盘 显示下载进度 暂停/恢复 下载 解压文件 多线程下载 B.基本知识 1.小文件下载 如果文件比较小,下载方式会比较多直接用NSData的+ (id)dataWithCon ...
- [iOS 多线程 & 网络 - 2.10] - ASI框架下载文件
A.ASI框架中的下载 1.实现步骤 在实际的开发中如果要使用asi框架来下载服务器上的文件,只需要执行下面简单的几个步骤即可. (1)创建请求对象:(2)设置下载文件保存的路径:(3)发送下载文件的 ...
- [iOS 多线程 & 网络 - 2.9] - ASI框架
A.ASI基本知识 1.ASI简单介绍 ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大. ASI的实现基于底层的CFNetwork框架,因此运行效率很高. ASI的g ...
- [iOS 多线程 & 网络 - 2.7] - NSURLCache
A.基本知识 1.为什么需要缓存? 有时候一个url会请求多次,得到的内容确实一样的 2.缓存的概念 3.缓存数据的过程 当服务器返回数据时,需要做以下步骤(1)使用服务器的数 ...
- [iOS 多线程 & 网络 - 2.6] - 使用POST上传JSON数据 & 多值参数
A.上传JSON 1.思路: 必须使用POST方法才能上传大量JSON数据 设置请求头:设置Content-Type 设置请求体,JSON实际相当于字典,可以用NSDictionary NSJSONS ...
随机推荐
- [UESTC1059]秋实大哥与小朋友(线段树, 离散化)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1059 普通线段树+离散化,关键是……离散化后建树和查询都要按照基本法!!!RE了不知道多少次………………我真 ...
- sh.exe": grunt: command not found
今天在git命令行工具中使用 grunt的时候,总是提示我找不到grunt命令,如: sh.exe": grunt: command not found 但是我运行 npm install ...
- android的ScaleGestureDetector缩放类详解
文章由多出组合,它们来自: http://elvajxw.iteye.com/blog/1308452 http://www.cnblogs.com/lknlfy/archive/2012/03/11 ...
- A06_RelativeLayout的属性设置
设有两个控件one和two,以控件one为基准.由于代码比较简单就不贴了,直接上效果图. 一.第一组:将控件two放在控件one的上.下.左.右.开始.结束. android:layout_below ...
- HDU 4870 Rating (2014 Multi-University Training Contest 1)
Rating Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- UVa 11916 (离散对数) Emoogle Grid
因为题目要求同列相邻两格不同色,所以列与列之间不影响,可以逐列染色. 如果一个格子的上面相邻的格子,已经被染色则染这个格子的时候,共有k-1中选择. 反过来,如果一个格子位于第一列,或者上面相邻的格子 ...
- highcharts 设置标题不显示
设置标题不显示:title:false 用法: title: { text: false },
- codevs 1172 Hankson 的趣味题
woc....这题考细节处理.要注意代码的逻辑顺序还有不要作死地循环到sqrt+1. #include<iostream> #include<cstdio> #include& ...
- I.MX6 Power off register hacking
/*********************************************************************** * I.MX6 Power off register ...
- apache开源项目-- Usergrid
Ed Anuff上周宣布第一版 Usergrid 的代码已经发布,Usergrid 是一款适用于移动和富客户端应用的综合性平台.Ed 认为,良好的移动性指的是将设备中运行应用的良好交互带到云中,其中既 ...