ios 开发 用户注册 用ios同步请求数据吗

iOS开发网络部分(5)
HTTP : 是应用层的网络传输协议,对于http的请求方式 包括两种:GET 和 POST , 链接方式也包括两种 同步链接 和 异步链接
GET 和 POST 请求的区别:
1:GET请求 : 服务器的地址 和 请求参数都会出现在请求接口中,也就是说 服务器地址和请求参数共同组成了请求借口, 然而POST请求,请求参数不会出现在请求接口中,而是作为请求体提交给服务器.
2:因为GET请求的请求参数 会出现在请求接口中,所有信息容易被捕获,安全性低,而POST请求的请求参数封装在请求体中,作为二进制流进行传输,安全性高,
3:GET请求的请求接口中有请求参数,而对于请求接口我们有字节限制,这样导致GET请求有一定的局限性.
所以对于GET请求只能上传小型数据,而对于POST请求,请求体理论上可以无限大,所以,一般来说,从服务器请求数据用GET 上传数据用POST,
两种请求方式:都能给服务器传输数据
1 、给服务器传输数据的?式:
GET :通过网址字符串 。
POST :通过 data
2 、传输数据的?小:
GET :网址字符串最多 255 字节 。
POST :使? NSData ,容量超过 1G
3 、安全性 :
GET :所有传输给服务器的数据,显?示在?址里,类似于密码的明?输入,直接可?。
POST :数据被转成 NSData( ?进制数据 ) ,类似于密码的密?输?,?法直接读取。
同步异步连接的区别:
同步连接:程序容易出现卡死现象
异步连接:等待数据返回。 界面更加流畅
异步联接有两种实现?式:
(1)设置代理,接收数据
(2)实现 block
服务器端 PHP 简单接?
PHP 中使?不同的函数获取数据,?持不同的请求方式:
(1)GET 请求:使?GET[“key”]获取数据网址中的数据(2)POST请求:使?_POST[“key”] 获取上传 data 中的数据
(3)GET、POST 请求:使? $_REQUEST[“key”] 获取数据
在 iOS 平台使? NSURL 、 NSURLRequest 等对象完成与接?的交互
?络请求的步骤:
1 、 NSURL ;
2 、 NSURLRequest ;
3 、 NSURLConnection ;
4 、处理 Error 或者返回数据
#define kPicURL @".cn/56/13/4.jpg"
#define kNewsURL @"http://ipad-.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=&startRecord=1&len=5&udid=&terminalType=Iphone&cid=213"
#define kTuDouURL @"/v3/gw?method=album.channel.get&appKey=myKey&format=xml&channel=c&pageNo=1&pageSize=15"
#define kTuDouURLPost @"/v3/gw?"
======================================================
@interfaceViewController ()&NSURLConnectionDataDelegate&
@property (retain, nonatomic) IBOutlet UIImageView *ImageV
@property (nonatomic,retain)NSMutableData *
@implementation ViewController
- (IBAction)synGET:(id)sender {
NSString *urlStr = [NSString stringWithFormat:@"%@",kPicURL];
NSString *newStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:newStr];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSLog(@"回应
%@",response);
NSLog(@"错误 %@",error);
NSDictionary *newsDic = [NSJSONSerialization JSONObjectWithData:data options:5 error:nil];
NSLog(@"%@",newsDic);
POST请求用NSMutableURLRequest创建可变请求对象
目的是为了追加HTTPBody
- (IBAction)synPOST:(id)sender {
NSString *urlStr = [NSString stringWithFormat:@"%@",kTuDouURLPost];
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *muRequest = [NSMutableURLRequest requestWithURL:url];
NSString *paraStr = @"method=album.channel.get&appKey=myKey&format=json&channel=c&pageNo=1&pageSize=15";
NSData *data = [paraStr dataUsingEncoding:NSUTF8StringEncoding];
[muRequest setHTTPBody:data];
[muRequest setHTTPMethod:@"POST"];
NSData *data1 = [NSURLConnection sendSynchronousRequest:muRequest returningResponse:nil error:nil];
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data1 options:0 error:nil];
NSLog(@"%@",dic);
- (IBAction)asynGET:(id)sender {
NSString *urlStr = [NSString stringWithFormat:@"%@",kPicURL];
NSString *newStr
= [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:newStr];
NSURLRequest *reQuest = [NSURLRequest requestWithURL:url];
[NSURLConnection connectionWithRequest:reQuest delegate:self];
[NSURLConnection sendAsynchronousRequest:reQuest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
_ImageView.image = [UIImage imageWithData:data];
- (IBAction)asynPOST:(id)sender {
NSURL *url = [NSURL URLWithString:@"http://ipad-.cn/DigitalPublication/publish/Handler/APINewsList.ashx?"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
NSString *paraStr =
@"date=&startRecord=1&len=5&udid=&terminalType=Iphone&cid=213";
NSData *bodydata = [paraStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:bodydata];
[request setHTTPMethod:@"POST"];
[NSURLConnection connectionWithRequest:request delegate:self];
#pragma mark - NSURLConmectionDtaDelegate
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
if (_data == nil) {
self.data = [NSMutableData data];
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
[_data appendData:data];
_ImageView.image = [UIImage imageWithData:_data];
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSDictionary *newsDic = [NSJSONSerialization JSONObjectWithData:_data options:0 error:nil];
NSLog(@"%@",newsDic);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:51415次
积分:1297
积分:1297
排名:千里之外
原创:79篇
转载:12篇
(1)(6)(1)(6)(13)(19)(31)(1)(2)(10)(3)1451人阅读
今天又打开了好久没写的博客,看了一下日期,距离上一次写博客正好一个月,这一个月,又学到了好多关于iOS开发的知识, 今天就来说说关于iOS开发过程中的网络请求。
关于网络请求的重要性我想不用多说了吧。对于移动客户端来说,网络的重要性不言而喻。常见的网络请求有同步GET, 同步POST, 异步GET, 异步POST。今天来看一下四种网络请求的实现方式。
一、同步GET
// 1.将网址初始化成一个OC字符串对象
NSString *urlStr = [NSString stringWithFormat:@&%@?query=%@&region=%@&output=json&ak=6E823f587c95f9b99295&, kBusinessInfoURL, @&银行&, @&济南&];
// 如果网址中存在中文,进行URLEncode
NSString *newUrlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// 2.构建网络URL对象, NSURL
NSURL *url = [NSURL URLWithString:newUrlStr];
// 3.创建网络请求
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
// 创建同步链接
NSURLResponse *response =
NSError *error =
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
当创建好同步链接以后, 就可以采用相应的方法进行解析。下面创建异步连接也是一样的。
二、同步POST
// 1.根据网址初始化OC字符串对象
NSString *urlStr = [NSString stringWithFormat:@&%@&, kVideoURL];
// 2.创建NSURL对象
NSURL *url = [NSURL URLWithString:urlStr];
// 3.创建请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 4.创建参数字符串对象
NSString *parmStr = @&method=album.channel.get&appKey=myKey&format=json&channel=t&pageNo=1&pageSize=10&;
// 5.将字符串转为NSData对象
NSData *pramData = [parmStr dataUsingEncoding:NSUTF8StringEncoding];
// 6.设置请求体
[request setHTTPBody:pramData];
// 7.设置请求方式
[request setHTTPMethod:@&POST&];
// 创建同步链接
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
三、异步GET
NSString *urlStr = [NSString stringWithFormat:@&.cn/56/13/4.jpg&];
NSString *newStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:newStr];
NSURLRequest *requst = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
//异步链接(形式1,较少用)
[NSURLConnection sendAsynchronousRequest:requst queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
self.imageView.image = [UIImage imageWithData:data];
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@&%@&, dic);
}];四、异步POST
// POST请求
NSString *urlString = [NSString stringWithFormat:@&%@&,kVideoURL];
//创建url对象
NSURL *url = [NSURL URLWithString:urlString];
//创建请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
//创建参数字符串对象
NSString *parmStr = [NSString stringWithFormat:@&method=album.channel.get&appKey=myKey&format=json&channel=t&pageNo=1&pageSize=10&];
//将字符串转换为NSData对象
NSData *data = [parmStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
[request setHTTPMethod:@&POST&];
//创建异步连接(形式二)
[NSURLConnection connectionWithRequest:request delegate:self];
一般的,当创建异步连接时, 很少用到第一种方式,经常使用的是代理方法。关于NSURLConnectionDataDelegate,我们经常使用的协议方法为一下几个:
// 服务器接收到请求时
- (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
NSLog(@&%s&, __FUNCTION__);
最后,分析一下这几种呢网络请求的区别。
GET请求和POST请求的区别:
& & 1. GET请求的接口会包含参数部分,参数会作为网址的一部分,服务器地址与参数之间通过
? 来间隔. POST请求会将服务器地址与参数分开,请求接口中只有服务器地址,而参数会作为请求的一部分,提交后台服务器
& & 2. GET请求参数会出现在接口中,不安全.而POST请求相对安全
& & 3.虽然GET请求和POST请求都可以用来请求和提交数据,但是一般的GET多用于从后台请求数据,
POST多用于向后台提交数据
同步和异步的区别:
& &同步链接:主线程去请求数据,当数据请求完毕之前,其他线程一律不响应,会造成程序就假死现象
& &异步链接:会单独开一个线程去处理网络请求,主线程依然处于可交互状态,程序运行流畅
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:18933次
排名:千里之外iOS学习笔记——同步请求下载与异步请求下载
1.同步请求下载
同步请求与用户的交互不太好,容易出现卡顿的现象,一般不使用。发送请求后等待服务器的响应,返回数据后进行下一步的操作。
创建一个空白视图,在AppDelegate.m文件中的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)lanuchOptions方法中添加如下代码:
//-----同步请求下载
//获取网络资源路径(URL)
NSURL * pURL = [NSURL URLWithString:@""];
//创建一个请求
NSURLRequest * pRequest = [NSURLRequest requestWithURL:pURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
//建立连接
NSURLResponse * pResponse =
NSError * pError =
//向服务器发起请求(发出后线程就会一直等待服务器响应,知道超出最大响应事件),获取数据后,转换为NSData类型数据
NSData * pData = [NSURLConnection sendSynchronousRequest:pRequest returningResponse:&pResponse error:&pError];
//输出数据,查看,??后期还可以解析数据
NSLog(@"pData = %@",pData);
NSLog(@"pError = %@",[pError localizedDescription]);
2.异步请求下载
异步轻骑支持应用程序在后台下载数据,在等待下砸完成的过程中不影响用户的其他操作。异步请求需要实现NSURLConnectionDataDelegate协议,实现其中的方法。同时需要创建一个可变的NSMutableData类型对象,存储下载得到的数据。
在.h文件里,遵循协议,创建存储数据的对象,代码如下:
@interface LinAppDelegate : UIResponder
@property (retain, nonatomic) NSMutableData * pD
@property (strong, nonatomic) UIWindow *
@end一定要记得释放创建的对象。
在.h文件里,实现协议的方法,完成异步请求数据的存储,代码如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
self.window.backgroundColor = [UIColor whiteColor];
//-----异步请求
//获取网络资源路径(URL)
NSURL * pURL = [NSURL URLWithString:@"hppt://"];
//根据URL创建请求
NSURLRequest * pRequest = [NSURLRequest requestWithURL:pURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
//发起请求,通过委托模式回调完成数据获取
[NSURLConnection connectionWithRequest:pRequest delegate:self];
[self.window makeKeyAndVisible];
return YES;
#pragma mark-----NSURLConnectionDataDelegate
//服务器响应回调的方法
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
NSLog(@"服务器响应!");
//初始化,创建内存空间
self.pData = [NSMutableData dataWithCapacity:5000];
//服务器返回数据,客户端开始接受(data为返回的数据)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
NSLog(@"服务器返回数据!");
//将返回数据放入缓存
[self.pData appendData:data];
//数据接受完毕回调的方法
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
NSLog(@"数据接收完毕!");
//输出接受到的数据
NSLog(@"pData = %@",self.pData);
//接受数据失败的时候调用的方法
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
NSLog(@"数据接受失败,失败的原因:%@",[error localizedDescription]);iOS开发之使用信号量实现AFN请求同步 - 博客频道 - CSDN.NET
首字母大写-博客
有梦想才有坚持,有付出才有收获
好久没写文章了。。
忙碌的工作,一不小心就让我把这个好习惯给抛弃了。 也是自己不够毅力坚持吧。有人跟我说,写这些文章没什么意义,这些问题你解决过,你就会有很深的印象,下次如果遇到同样的问题一定会立即反应出同样的问题。我说我写文的意义不是为了记录这些问题的解决办法,我写文意义而是去分享,我乐于分享,当自己不断成长的时候,偶尔会回头看看自己的成长历程,看着这些“脚印”我内心会无比开心,也会激励我要踏实走好每一步,要不断努力,不断学习。
言归正传,先说说我自己问题。
我们App请求数据时大部分人都会选择AFNetworking。使用AFN异步请求,请求的数据返回后,就刷新相关UI。那么如果某一个页面有多个网络请求,假设有三个请求,A、B、C,而且UI里的数据必须等到A、B、C全部完成后刷新后才正确。那么三个单纯的AFN请求,已经很明显不满足我们的需求了。
解决办法一
我就认为它是最简单最快解决问题也是最“笨”方法吧(我第一次使用的就是该方法)。设一个全局变量,每次请求成功后该变量都+1,并且都检查该变量的值是不是3。如果是的话就刷新页面。伪代码如下:
int temp = 0;
request A {
[self checkTemp];
request B {
[self checkTemp];
request C {
[self checkTemp];
checkTemp {
if (temp == 3){
解决办法二
主题来了,使用信号量也同样可以解决这样的问题。直接上代码。
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self requestA];
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self requestB];
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self requestC];
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
- (void)requestA
dispatch_semaphore_t
sema = dispatch_semaphore_create(0);
[Request postWithURL:url params:params success:^(id response){
dispatch_semaphore_signal(sema);
} failure:^(NSError *error) {
dispatch_semaphore_signal(sema);
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
requestB和requestC同上。我这就不写了。
dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
上面requestA、requestB、requestC加了信号量同时使用GCD多线程的调度组后,他们也是异步执行,执行的先后顺不会卡住主线程。当A、B、Crequest的信号量全部都释放后,就会通知group_notify并执行其操作。
希望我的解决办法能帮助到有这些相关需求的朋友。
排名:千里之外

我要回帖

更多关于 ios 原生同步请求 的文章

 

随机推荐