扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
Web Service使用的主要协议是HTTP协议,即 超文本传输协议 。
10年积累的成都做网站、成都网站设计经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有汉川免费网站建设让你可以放心的选择与我们合作。
HTTP/1.1协议共定义了8种请求方法(OPTIONS、HEAD、GET、POST、PUT、DELETE、TRACE、CONNECT)作为Web服务器。
GET方法 ,是向指定的资源发送请求,请求的参数“显式”地在URL的后面。有点像明信片,把内容“显式”写在外面,因此安全性比较差。一般使用于读取数据、例如从服务器读取静态图片、或查询数据等。
POST方法 ,是向指定资源提交数据,请求服务器进行处理,数据包含在 请求体 中。参数和地址分开,放在body里面。有点像把信内容放在信封中,接触的人看不到,安全性比较高。一般用于例如提交表单、上传文件等(请求的的动态资源,与查询类似,每个方法调用都要传递很多参数,因此需要使用NSMutableURLRequest创建请求。 )
iOS SDK中为HTTP请求提供了同步和异步请求这两种不同的API,
同步请求,可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作,意味着线程阻塞;
异步请求,不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行;
它们的主要区别在于连接方式的不同。
下面通过请求一个登陆接口介绍有关于网络请求中的不同情况。
【本次开发环境: Xcode:7.2 iOS Simulator:iphone6 By:啊左】
一、GET方法
1.同步get方法:
//1.创建一个web路径
NSString*webPath=[NSString stringWithFormat:@";pass=%@btn=login",yourname,yourpass];
webPath=[webPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; //url不允许为中文等特殊字符,需要进行字符串的转码为URL字符串,例如空格转换后为“%20”;
NSURL *url=[NSURL URLWithString:webPath];
//2.根据WEB路径创建一个请求
NSURLRequest *request=[NSURLRequest requestWithURL:url];
NSURLResponse *respone;//获取连接的响应信息,可以为nil
NSError *error; //获取连接的错误时的信息,可以为nil
//3.得到服务器数据
NSData*data=[NSURLConnection sendSynchronousRequest: request returningResponse: respone error: error];
if(data==nil) { NSLog(@"登陆失败:%@,请重试",error); return; }
/* 4.对服务器获取的数据data进行相应的处理; */
2.异步get方法:
异步请求与同步请求的不同在于使用NSURLConnectionDataDelegate委托协议,指定代理.
@interface ViewController : UIViewController // 遵循协议
@property (weak,nonatomic) NSMutableData *receiveData; //创建一个可变data,用于异步接收服务器的数据
@end
创建网络请求:
//1.创建一个web路径
NSString*webPath=[NSString stringWithFormat: @";pass=%@btn=login",yourname,yourpass];
webPath=[webPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url=[NSURL URLWithString:webPath];
//2.根据WEB路径创建一个请求
NSURLRequest *request=[NSURLRequest requestWithURL:url];
//3.指定代理 以异步的方式接收数据NSURLConnectionDataDelegate
NSURLConnection *con=[NSURLConnection connectionWithRequest:request delegate:self];
if(con==nil)
{
NSLog(@"创建连接失败.");
return;
}
else//成功 准备接数据
{
if(self.receiveData==nil)
{
self.receiveData=[[NSMutableData alloc] init];
}
}
异步的代理行为:
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
NSLog(@"已经响应成功.");
//清空 为当前连接做准备
self.receiveData.length=0;
}
-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ NSLog(@"已经接收到了数据.");
//追加接收到的数据
[self.receiveData appendData:data];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSLog(@"接收数据已经完成.");
/* 对服务器获取的数据receiveData进行相应的处理; */
}
-(void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ NSLog(@"连接失败.");
}
二、POST方法
1.同步post方法:
//1.创建一个web路径
NSString *webPath=@"";
webPath = [webPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url=[NSURL URLWithString:webPath];
//2.建立一个带协议缓存类型的请求 (使用NSMutableURLRequest,是post方法的关键) NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10]; //3.设置表单提交的方法(默认为get) [request setHTTPMethod: @"post"];
//4.设置要提交的参数 NSString *args=[NSString stringWithFormat:@"uname=%@upas=%@btn=login",uname,upas]; [request setHTTPBody: [args dataUsingEncoding:NSUTF8StringEncoding]];
NSData *recvData=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; if(recvData!=nil) {
/*
对服务器获取的数据recvData进行相应的处理
*/
}
else
{
NSLog(@"连接失败,请重试!");
}
2.post方法的异步与同步的区别在于使用NSURLConnectionDataDelegate委托协议,指定代理.
这一点与get方法一致,所以就不进行长篇幅的演示了。
以上就是关于部分网络同步异步请求,get、post请求方法的演示,由于UI控件还有其他的处理没有附上,具体的读者可以进行相应细节的调整,进行完整的网络请求项目开发。
由于iOS开始,引入了新的网络接口NSURLSession,而在iOS9中NSURLConnection被宣布弃用,因此关于NSURLSession发送GET和POST请求的资料部分,有兴趣的可以参考:
iOS开发 GET、POST请求方法(NSURLSession篇)
by:啊左~
如果你用的 AFNetworking- (NSMutableURLRequest *)requestWithMethod:(NSString *)method path:(NSString *)path parameters:(NSDictionary *)parameters//方法通过添加 [request setTimeoutInterval:10.0];如果是 ASIHTTPRequest[request setNumberOfTimesToRetryOnTimeout:2]; NSMutableURLRequest是NSURLRequest的子类,常用方法有设置请求超时等待时间(超过这个时间就算超时,请求失败)NSMutableURLRequest *urlRequest = [[NSMutableURLRequestalloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicytimeoutInterval:10]; NSURLConnection *_connection = [[NSURLConnectionalloc] initWithRequest:urlRequest delegate:selfstartImmediately:YES];一个用来创建请求,一个用来将请求发送出去。然后我们实现 NSUrlConnectionDelegate 的几个回调函数就能完成整个流程了。 一般发送网络请求都会去设置一个超时时间,防止请求在那一直等待。根据不同的场景,我们还需要设置不同的超时时间。在上面的代码中我们设置了10秒超时。上面的故事看起来很完美。但是 apple的开发人员在这里给我们挖了一个坑。如果你的请求是个简单的“Get”请求,或者木有 body的“post”请求。一切都是那么完美,请求能够按照我们设定的时间自动超时。但是如果你发的是个“POST”请求,并且[urlRequest setHTTPBody:httpBody]; 那么,不好意思,你被潜规则了。ios3.0 以后 苹果的sdk对这种情况做了调整,如果是post请求,并且设置了 httpBody,那么请求的超时时间就被默认设置为 240 秒了。就算你再使用[urlRequest setTimeoutInterval:10];也是无效的,我们可以再设置完成后再读取这个值,发现它不会变成10,依然保持240秒。于是乎,网络不稳定的时候,你的程序就可能会陷入漫长的等待。发现这个问题后。我们通过自己起timer的方式来控制超时。具体怎么弄这里就不细说。只说下我们的策略。我们将整个网络过程分为 链接建立,发送数据,数据发送完成等待回包,接收数据 4个阶段来控制具体的超时。 设置我们的标准超时时间为 N (系统默认为 10秒,网络模块通过暴露相关接口,调用方可自由设置)链接建立链接超时时间: N * 1.5 每数据包发送超时时间: N * 1.5 数据发送完成等带回包超时: N * 2 每数据包接收超时时间: N * 1 以上超时分别在 NSUrlConnectionDelegate 的各个回调阶段进行相关设置就能达到比较精细的控制。特别说明下,为什么数据发送完成后等待回包的超时会设置的比较长。因为在实际测试过程中发现发包完成到接收到第一个数据包比较耗时,一般httpbody越大越明显,初步猜测是网络模块在发送数据缓冲区的数据,所以这里做了特殊的控制。 部分内容来自于博客园《NSURLCONNECTION 网络超时的那些事。》
随着asihttprequest的停止更新,许多人都转向了AFNetworking、 MKNetworkKit.我也是其中一个。于是我从网上找了许多文章作参考,但是结果都是失败告终。研究了好久都搞不透,最后还是请人帮忙搞定了。经常从网上索取免费资料的一员,要有回报的思想,也为了让更多的人少走些弯路,所以下面是代码:(有错误可以指出)
首先:将AFNetworking、UIKit+AFNetworking 加入到工程
然后在要使用的地方
#import "AFHTTPRequestOperationManager.h"
#import "AFHTTPSessionManager.h"
AFHTTPRequestOperationManager的post有两个方法,一个是普通的post,另一个是可以上传图片的
1.上传图片:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];
manager.responseSerializer.acceptableContentTypes = [NSSetsetWithObject:@"text/html"];
NSDictionary *parameters =@{@"参数1":@"value1",@"参数2":@"value2"、、、};
NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"1.png"], 1.0);
[manager POST:@"替换成你要访问的地址"parameters:parametersconstructingBodyWithBlock:^(idAFMultipartFormData formData) {
[formData appendPartWithFileData :imageData name:@"1" fileName:@"1.png" mimeType:@"image/jpeg"];
} success:^(AFHTTPRequestOperation *operation,id responseObject) {
NSLog(@"Success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation,NSError *error) {
NSLog(@"Error: %@", error);
}];
这个方法可以上传图片,如果不用上传图片,可以把这句去掉[formData appendPartWithFileData :imageDataname:@"1"fileName:@"1.png"mimeType:@"image/jpeg"]
2.普通的post
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];
manager.responseSerializer.acceptableContentTypes = [NSSetsetWithObject:@"text/html"];
NSDictionary *parameters = @{@"参数1":@"value1",@"参数2":@"value2"、、、};
[managerPOST:@"替换成你要访问的地址"parameters:parameters
success:^(AFHTTPRequestOperation *operation,id responseObject) {
NSLog(@"Success: %@", responseObject);
}failure:^(AFHTTPRequestOperation *operation,NSError *error) {
NSLog(@"Error: %@", error);
}];
可以参考一下。AFNetworking-2.0.3
简单的说:1.get请求指示单纯的想服务器获取信息,不会改变数据,post请求可以修改数据,也就是说get只能 用于获取信息,post可以获取信息也可以修改、增加数据;
2.get适用于小数据的交互,如果数据量较大就必须要用post请求;
3.安全性:get请求安全性低,post安全性高,post会把请求参数隐藏,get请求会曝露参数;
建议:
1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
2、在做数据查询时,建议用Get方式;而在做数据添加、修改、或删除时,建议用Post方式;我是做ios开发的,如果有其他问题欢迎一起研究讨论,q:
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15];
[request setHTTPMethod:@"POST"];
NSString *parametersStr = [self getPostStr:parameters];//eg :@"city=szname=jack"
NSData *data = [parametersStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
////////////
NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
[connection start];
/////////
各种connection回调。。。。
就不详细说明了
#pragma mark - 网络请求回调
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
self.mTempData = [[NSMutableData alloc]initWithCapacity:10];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[self.mTempData appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
self.recievedData = self.mTempData;
NSString *jsonString = [[NSString alloc]initWithData:self.recievedData encoding:NSUTF8StringEncoding];
NSLog(@"HttpCallBack_connectionRecieved Data:%@",jsonString);
//将字符串写到缓冲区。
NSData* jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
//解析json数据,使用系统方法 JSONObjectWithData: options: error:
NSDictionary* dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSUTF8StringEncoding error:nil];
if ([_target respondsToSelector:@selector(HttpConnectionCallback:path:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[_target HttpConnectionCallback:dic path:_path];
});
}
}
//failure
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
if ([_target respondsToSelector:@selector(HttpConnectionFailed:path:)]) {
dispatch_async(dispatch_get_main_queue(), ^{
[_target HttpConnectionFailed:error path:_path];
});
}
}
由于种种因素,现在国内的移动开发大都是原生和html5混合开发, 那么iOS端的UIWebView和WKWebView就启到了非常重要的作用! 而从我们原生页面跳转的web页面的时候我们往往需要像前端传递参数,今天我们要说的就是:webView怎么加载post请求并传递参数!
代码如下:
UIWebView *webView = [[UIWebView alloc] init];
NSString *bodyShare = [NSString stringWithFormat: @"hID=%@", userID];
NSMutableURLRequest * requestShare = [[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:self.urlStr]];
[requestShare setHTTPMethod: @"POST"];
[requestShare setHTTPBody: [bodyShare dataUsingEncoding: NSUTF8StringEncoding]];
[webView loadRequest:requestShare];
当然与之相对应的还有get请求来传递参数的,代码如下:
UIWebView *webView = [[UIWebView alloc] init];
self.urlStr = [NSString stringWithFormat:@"%@/tokenredirect?ostype=iphonetoken=%@time=%@",kServerPrefixURL,token,time];
NSURLRequest * requestShare = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:self.urlStr]];
[webView loadRequest:requestShare];
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流