当前位置:首页 >> 互联网 >>

ios数据请求


NSString *newString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSChara cterSet URLFragmentAllowedCharacterSet]];

NSURLRequest默认的请求方式是Get请求,且只能做Get请求,是一个 不可变的请求 @interface NSURLRequest : NSObject <NSSecureCoding, NSCopying, NSMutableCopying + (instancetype)requestWithURL:(NSURL *)URL; @end @interface NSURLRequest (NSHTTPURLRequest) @property (nullable, readonly, copy) NSData *HTTPBody; @property (nullable, readonly, copy) NSString *HTTPMethod; @end @interface NSMutableURLRequest : NSURLRequest @end @interface NSURLConnection (NSURLConnectionSynchronousLoading) + (nullable NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse * __nullable * __nullable)response error:(NSError **)error; @end @interface NSURLConnection (NSURLConnectionQueuedLoading) + (void)sendAsynchronousRequest:(NSURLRequest*) request queue:(NSOperationQueue*) queue

completionHandler:(void (^)(NSURLResponse* __nullable response, NSData* __nullable data, NSError* __nullable connectionError)) handler; @end @interface NSURLResponse : NSObject <NSSecureCoding, NSCopying @end @interface NSURLSession : NSObject + (NSURLSession *)sharedSession; @property (nullable, readonly, retain) id <NSURLSessionDelegate> delegate; + (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration; + (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(nullable id <NSURLSessionDelegate>)delegate delegateQueue:(nullable NSOperationQueue *)queue; @end @interface NSURLSession (NSURLSessionAsynchronousConvenience) - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error))completionHandler; @end @interface NSURLSessionTask : NSObject <NSCopying - (void)resume;

@end @interface NSURLSessionDataTask : NSURLSessionTask @end @interface NSURLSessionConfiguration : NSObject <NSCopying + (NSURLSessionConfiguration *)defaultSessionConfiguration; @end HTTP 超文本的传输协议,是短连接,是客户端主动发送请求服务器做出 响应,服务器响应之后连接断开. 由于Xcode只支持HTTPs协议,因此需要修改以下操作

一.HTTP请求方法 请求方法(不区分大小写),一般只用前两个: GET、 POST、 OPTIONS、 HEAD、 PUT、 DELETE、 TRACE、 CONNECT、 PATCH 二.发送http请求的工具 <1>苹果原生: * NSURLConnection:用法简单,古老经典的一种方案.现在已不推荐 使用 * NSURLSession:iOS7以后推出的技术,功能比NSURLConnection 更加强大 * CFNetWork:NSURL 的底层,纯C语言,一般不用. <2>第三方框架: * ASIHttpRequest:http终结者,功能很强大,可惜作者已停止更新, 2012年停止更新。

* AFNetWorking:简单易用,提供了基本够用的常用功能,维护和使用 者多. * MKNetWorkKit:简单易用,产自印度,维护和使用者少. 三.两种常用的请求方法 1.GET请求 1. GET 请求的请求参数都拼接在 url 中. 2. ?号后面都是参数内容.?前面是具体的接口名称. 3. 参数格式: key=value 的格式. 4. key:是服务器接收参数的key值.一般是服务器人员告诉我们. 5. 多个参数之间以&符号分割 6. 参数在地址后拼接没有请求数据不安全(因为所有的参数都拼接 在地址后面).不适合传输大量数据(长度有限制,1024字节) 7.GET提交的数据会在地址栏显示出来 对于 GET 请求,请求参数都封装在了 url 中,只要截取到url都能获 得参数内容.GET请求不安全! url是有长度限制的!如果参数比较多,是不能使用GET 请求发送的. GET请求默认会在本地做数据缓存. 2.POST请求 1.POST请求的所有参数都封装在请求体中.理论上没有长度限制. 2.外界查看不到POST的请求参数,POST请求比GET请求安全!涉及 到私密信息的传递,一定要使用POST请求. 3.POST请求默认情况下,不会在本地做数据缓存. 4.参数在请求数据区放着相对GET请求更安全,并且数据大小没有 限制.把提交的数据放置在HTTP包的<request>中 文件上传只能使用POST请求.

GET 提交时,传输数据就会受到URL长度的限制 POST 由于不是通过 URL传值理论上不受限制 安全性:POST 安全性要比GET的安全性高; 通过GET提交数据用户名和密码将明文出现在URL 比如登陆界面有可 能被被浏览器缓存. Get请求和Post请求的共同点:都可以想服务器发送网络请求,传输数据 不同点: GET:url和参数都要写在一起,而且是以明文的形式展示的 POST:url和参数没有写在一起,且参数部分要转换为NSData对象,相当 于加密了,稍微完全些 GET:请求的数据量一般都比较小 POST:请求的数据量比较大,理论上是无上限的,但是服务器会对POST 请求的数据量进行限制,(上传,下载) 同步和异步的区别: 同步链接:主线程去请求数据,当数据请求完毕之前,其他线程一律不 响应,会造成程序就假死现象。 异步链接:会单独开一个线程去处理网络请求,主线程依然处于可交互 状态,程序运行流畅。 同步请求:任务由主线程完成的,在请求没有完成之前用户的所有其他操 作都无法响应,给人造成一种卡顿的现象,影响用户体验 异步请求:任务由子线程完成,这个线程是由系统开辟的,子线程中的任务 不会影响到主线程中的其他操作,所以在子线程中往往做一些耗时操作, 不会影响用户体验,但是一旦开辟了子线程就会消耗资源,此时采用的是 以空间换时间

请求大图片 - (IBAction)getImageFromNet:(UIButton *)sender { //http://f1.topit.me/1/d2/8c/11663656284128cd21o.jpg

//创建NSURL对象 NSString *urlString = @"http://f1.topit.me/1/d2/8c/11663656284128cd21o.jpg"; NSURL *url = [NSURL URLWithString:urlString]; //创建网络请求对象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //建立同步网络连接 // NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; //图片,视频,音乐网络资源是不需要解析的,可以直接拿来使用 //self.bigImageView.image = [UIImage imageWithData:data];

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { self.bigImageView.image = [UIImage imageWithData:data]; }]; } Get同步请求 - (IBAction)handleGetSyn:(UIButton *)sender { //创建网络地址(NSURL)对象 NSString *urlString = @"http://api.map.baidu.com/place/v2/search?query=大保健&region= 郑州&output=json&ak=6E823f587c95f0148c19993539b99295”; //如果字符串中有中文的话, 就需要转码,没有中文省略此步 NSString *newString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacte rSet URLFragmentAllowedCharacterSet]];

NSURL *url = [NSURL URLWithString:newString]; //创建网路请求对象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //建立网络连接 NSURLResponse *response = nil; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil]; NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil]; NSLog(@"%@",dict); }

Get异步请求 - (IBAction)handleGetAsyn:(UIButton *)sender { NSString *urlString = @"http://api.map.baidu.com/place/v2/search?query=大保健&region= 郑州&output=json&ak=6E823f587c95f0148c19993539b99295"; NSString *newString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacte rSet URLFragmentAllowedCharacterSet]]; NSURL *url = [NSURL URLWithString:newString]; //创建网络请求对象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //建立网络连接 //[NSOperationQueue mainQueue]获取主队列(主线程)

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { //data存储的书异步请求下来的数据 //response网络响应对象 //contentionError 错误信息 id result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; NSLog(@"%@",result); }]; }

Post异步请求 - (IBAction)handlePostAsyn:(UIButton *)sender { //准备URL NSString *urlString = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/API NewsList.ashx"; NSURL *url = [NSURL URLWithString:urlString]; //创建网络请求对象 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.HTTPMethod = @"POST"; NSString *bodyString = @"date=20151101&startRecord=1&len=5&udid=1234567890&termin alType=Iphone&cid=213";

NSData *data = [bodyString dataUsingEncoding:NSUTF8StringEncoding]; request.HTTPBody = data; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { id result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; NSLog(@"%@",result); }]; } Post同步请求 - (IBAction)handlePostSyn:(UIButton *)sender { //http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/API NewsList.ashx?date=20151101&startRecord=1&len=5&udid=123456 7890&terminalType=Iphone&cid=213 //1.准备NSURL NSString *urlString = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/API NewsList.ashx"; NSURL *url = [NSURL URLWithString:urlString]; //2.创建网络请求对象 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; //设置网络请求对象请求方式 request.HTTPMethod = @"POST"; //设置网络请求体(参数部分) NSString *bodyString = @"date=20151101&startRecord=1&len=5&udid=1234567890&termin alType=Iphone&cid=213"; //将字符串转为NSData

NSData *data = [bodyString dataUsingEncoding:NSUTF8StringEncoding]; request.HTTPBody = data; //建立网路同步请求 NSData *data1 = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; id result = [NSJSONSerialization JSONObjectWithData:data1 options:(NSJSONReadingMutableContainers) error:nil]; NSLog(@"%@",result); } 全局Session的GET请求 - (IBAction)handleSessionGET:(UIButton *)sender { //创建NSURL对象 NSString *urlString = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/API NewsList.ashx?date=20151101&startRecord=1&len=5&udid=123456 7890&terminalType=Iphone&cid=213"; NSURL *url = [NSURL URLWithString:urlString]; //创建网络请求对象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //创建NSURLSession全局网络会话对象(是一个单例,是系统提供的 创建方式) //网络会话对象可以执行的任务有:数据请求任务,数据下载任务,数据 上传任务 NSURLSession *session = [NSURLSession sharedSession]; //创建网络会话任务

//NSURLSessionDownloadTask 下载任务对象 //NSURLSessionUploadTask 上传任务对象 //NSURLSessionDataTask 数据请求任务对象 NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { //任务完成之后会对block三个参数赋值 //data数据请求的结果 //response响应对象 //error报错信息 id result = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil]; NSLog(@"%@",result); }]; //让任务重新变的活跃起来 [dataTask resume]; } 全局Session的POST请求 - (IBAction)handleSessionPOST:(UIButton *)sender { NSString *urlString = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/API NewsList.ashx"; NSURL *url = [NSURL URLWithString:urlString]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.HTTPMethod = @"POST"; NSString *bodyString = @"date=20151101&startRecord=1&len=5&udid=1234567890&termin alType=Iphone&cid=213"; request.HTTPBody = [bodyString dataUsingEncoding:NSUTF8StringEncoding];

NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { id result = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil]; NSLog(@"%@",result); }]; [dataTask resume]; } 自定义Session 使用自己创建的网络会话对象(注意:再开发过程中,建议尽量不要自己 创建网络会话对象,减少对底层资源的消耗) - (IBAction)handleSelfSession:(UIButton *)sender { //创建网络请求对象 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publi sh/Handler/APINewsList.ashx?date=20151101&startRecord=1&len=5 &udid=1234567890&terminalType=Iphone&cid=213"]]; //自定义网络会话对象 //创建网络会话配置对象,配置会话的对象的工作场景 //default,background,ephemeral(很少使用) //一般使用默认的会话场景 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration]; //发起网络请求任务

NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { id result = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil]; NSLog(@"%@",result); }]; [dataTask resume]; } 网上请求数据并显示 代理完成网络会话 - (IBAction)handleSessionDelegate:(UIButton *)sender { //创建网络请求对象 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publi sh/Handler/APINewsList.ashx?date=20151101&startRecord=1&len=5 &udid=1234567890&terminalType=Iphone&cid=213"]]; //使用代理完成网络会话的注意点: //1.不能使用全局的网络会话对象,因为全局网络会话对象不允许设 置代理 //2.只能使用自定义的网络会话对象 //配置网络会话对象 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; //创建会话对象 NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue mainQueue]];

//发起任务 NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request]; [dataTask resume]; } 收到服务器响应的时候自动触发 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler{ NSLog(@"收到服务器响应"); //允许收到响应后继续接收数据,如果不写,后面代理方法无法执行 completionHandler(NSURLSessionResponseAllow); } 接收到服务器返回的数据时触发,这个方法会触发多次,数据量比较大时. 网络条件不太好时 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{ [self.mData appendData:data]; NSLog(@"接收到数据"); } 任务完成时(无论成功和失败这个方法都会走) - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(nullable NSError *)error{ if (!error) {

id result = [NSJSONSerialization JSONObjectWithData:self.mData options:(NSJSONReadingMutableContainers) error:nil]; NSLog(@"%@",result); } NSLog(@"任务完成"); }

#import "BusinessListViewController.h" #import "BusinessCell.h" #import "Business.h" @interface BusinessListViewController () @property (nonatomic,strong)NSMutableArray *dataSource; @end @implementation BusinessListViewController - (NSMutableArray *)dataSource{ if (!_dataSource) { self.dataSource = [NSMutableArray array]; } return _dataSource; } - (void)viewDidLoad { [super viewDidLoad]; [self getDataFormNetWork]; } - (void)getDataFormNetWork{ NSString *urlString = @"http://api.map.baidu.com/place/v2/search?query=大保健&region= 郑州&output=json&ak=6E823f587c95f0148c19993539b99295";

NSString *newString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacte rSet URLFragmentAllowedCharacterSet]]; NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:newString]]; NSURLSession *session = [NSURLSession sharedSession]; //NSURLSession的任务,默认都是放在子线程中执行,而子线程不具 有刷新UI的功能,我们要把线程重新推回到主线程,让主线程刷新 NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { //解析数据 id result = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil]; for (NSDictionary *dict in result[@"results"]) { Business *business = [[Business alloc] init]; [business setValuesForKeysWithDictionary:dict]; [self.dataSource addObject:business]; } //GCD完成的线程通信,将子线程重新推回到主线程中的执行任 务 dispatch_async(dispatch_get_main_queue(), ^{ [self.tableView reloadData]; }); }]; [dataTask resume]; } - (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.dataSource.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { BusinessCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BusinessCell" forIndexPath:indexPath]; Business *business = self.dataSource[indexPath.row]; cell.nameLabel.text = business.name; cell.addressLabel.text = business.address; cell.phoneLabel.text = business.telephone; return cell; } /* // Override to support conditional editing of the table view. - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { // Return NO if you do not want the specified item to be editable. return YES; } */

/* // Override to support editing the table view. - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { // Delete the row from the data source [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; } else if (editingStyle == UITableViewCellEditingStyleInsert) { // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view } } */ /* // Override to support rearranging the table view. - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { } */ /* // Override to support conditional rearranging of the table view. - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { // Return NO if you do not want the item to be re-orderable. return YES; } */ /* #pragma mark - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

// Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. } */ @end


赞助商链接
相关文章:
iOS请求webservice
iOS请求webservice_计算机软件及应用_IT/计算机_专业资料。iOS 请求 webservice ...//接受返回数据 NSData * responseData = [NSURLConnection sendSynchronousRequest...
iOS培训-斗鱼直播APP之请求展示推荐数据
iOS培训-斗鱼直播APP之请求展示推荐数据_计算机软件及应用_IT/计算机_专业资料。本文档的主要内容是小码哥教育iOS培训课程的斗鱼直播APP之请求展示推荐数据的相关知识...
一些常见的IOS知识点
一些常见的IOS知识点_计算机软件及应用_IT/计算机_专业资料。一些常见的 IOS ...答:发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步...
iOS 进入一个类最先调用和只调用一次的方法
iOS 进入一个类最先调用和只调用一次的方法_计算机硬件及网络_IT/计算机_专业...<returns>编码后的请求数据</returns> static string BuildQuery(IDictionary<...
ios开发规范文档_图文
ios开发规范文档_计算机软件及应用_IT/计算机_专业资料。命名 命名规则对于维护...与数据处理,网络请求相对独立 基于功能模块原则,功能模块分包括数据/网络处理,UI...
iOS开发规范文档_图文
iOS开发规范文档_计算机软件及应用_IT/计算机_专业资料。iOS 开发规范命名 本文...与数据处理,网络请求相对独立 基于功能模块原则,功能模块分包括数据/网络处理,UI...
iOS UIView 基本属性用法和 本地通知 推送
import net.sf.json.JSONObject; iOS 获取当前手机系统语言 /** *黄金数据...["result"]) } } } // get 网络请求 func Get(api string,params ....
移动端IOS接口功能说明副本
列表页数据请求通用方法 1.URL http://192.168.6.94:8360/custom/IosAppUniversal/queryCustomObjectAll.app 2.请求方式 Post 3.请求参数说明 sessionId:登录后...
iOS使用自签名证书实现HTTPS请求
iOS使用自签名证书实现HTTPS请求 - iOS 使用自签名证书实现 HTTPS 请求 概述 在 16 年的 WWDC 中,Apple 已表示将从 2017 年 1 月 1 日起,所有新提...
记录文件6:基于IOS的易车新闻客户端的设计与实现
开发,基于 iOS 平台运行,使用 UIKit 框架进行 UI 界 面的开发,在网络传输方面,主要使用基于 HTTP 的网络模式,发送网络请求以 后,获得服务器的响应并接收数据。...
更多相关标签: