UI一揽子计划 16 (网络编程、HTTP协议、iOS 实现网络编程、服务器接口)

来源:互联网 发布:caffe on spark 编辑:程序博客网 时间:2024/05/29 13:03
一.GET 请求方法

1.get同步请求

// Get同步请求
- (
void)actionLeftButton:(UIBarButtonItem*)leftButton
{
   
// 创建网址对象
   
NSString *oldURL = kSearchURL;
    //如果你请求的网址中带有中文 得重新编码
   NSString *stringURL = [oldURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    //把字符串变成网址对象
   NSURL *url = [NSURLURLWithString:stringURL];
   // 发出一个请求
   // cachePolicy 缓存策略 一般选择默认的    timeoutInterval请求超时时间  (超过多少秒就)
   NSMutableURLRequest *urlRequest = [NSMutableURLRequestrequestWithURL:urlcachePolicy:(NSURLRequestUseProtocolCachePolicy)timeoutInterval:30.0];
    //默认 就是Get请求  NSURLRequest  如果要设置的话 需要使用可变请求  NSMutableURLRequest
    //设置请求类型   默认是get
    [urlRequestsetHTTPMethod:@"GET"];
    //建立连接
    //接收二进制数据
   //Response   服务器返回的 描述服务器的数据
   // error 链接错误信息
   
NSURLResponse *response = nil;
   
NSError *error = nil;
   
NSData *data = [NSURLConnectionsendSynchronousRequest:urlRequestreturningResponse:&responseerror:&error];
     //要把data转化成json数据
   NSMutableDictionary *dataDic =[NSJSONSerializationJSONObjectWithData:dataoptions:(NSJSONReadingMutableContainers)error:nil];
   
NSLog(@"----%@", dataDic);
}
2.get异步请求

// Get异步请求
- (void)actionRightButton:(UIBarButtonItem*)rightButton
{
   
   
// 如果网址有中文 就要重新编码
   
NSString *new = [kSearchURLstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
   //利用网址       创建一个网址对象
   NSURL *url = [NSURLURLWithString:new];
   // 利用网址对象   创建一个请求
   NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:urlcachePolicy:(NSURLRequestUseProtocolCachePolicy)timeoutInterval:30];
   // 设置请求类型
    [requestsetHTTPMethod:@"GET"];
#pragma mark异步请求两种方法1.Block方法实现
   /*  异步请求两种方法:
   1.  //
建立一个异步请求的链接
     // mainQueue
代表主线程
     [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
     //
异步相当于开启一个子线程 去加载数据
     //
数据加载完成 调用Block 回到主线程
    
     //
打印是否主线程
     NSLog(@"%d", [NSThread isMainThread]);
     }];
     */
   
#pragma mark异步请求两种方法2.代理方法实现
   
   
// 注意:  (同步异步有区别的地方)
   
//利用请求       创建一个链接
   // 遵守协议的名字 NSURLConnectionDataDelegate
   self.connection= [NSURLConnectionconnectionWithRequest:requestdelegate:self];
   
// 开启异步请求
    [self.connectionstart]; 
}
#pragma mark  --NSURLConnectionDataDelegate代理方法

- (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data
{
    [self.dataappendData:data];
   NSLog(@"接受数据时触发");
}

- (
void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response
{
    // 触发方法 链接成功 初始化可变的data
   self.data= [NSMutableDatadata];
    NSLog(@"接受到服务器数据,说明链接成功了.");
}


- (
void)connectionDidFinishLoading:(NSURLConnection*)connection
{
    // data已经完整了 接下来可以解析
   // 要把data转化成json数据
   
NSMutableDictionary *dataDic =[NSJSONSerializationJSONObjectWithData:self.dataoptions:(NSJSONReadingMutableContainers)error:nil];
   
NSLog(@"----%@", dataDic);
 NSLog(@"已经加载完成了");
}

/**
 *  NSURLConnectionDelegate
代理的方法 报错了
 */

- (
void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error
{
   
NSLog(@"查看错误信息");
}


二.POST
1.POST同步
//同步
- (
void)actionLeftButton:(UIBarButtonItem*)leftButton
{
   
// 1.创建网址对象
   
NSURL *url = [NSURLURLWithString:kNewsListURL];
   
// 2.利用网址对象创建一个请求
   
NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:urlcachePolicy:(NSURLRequestUseProtocolCachePolicy)timeoutInterval:30];
   
// 3.设置请求类型
    [request
setHTTPMethod:@"POST"];
   
// 4.注意:给这个请求携带一个请求体
   
NSData *data1 = [kNewsListParamdataUsingEncoding:NSUTF8StringEncoding];
   
// 携带到请求当中
    [request
setHTTPBody: data1];
   
// 5.利用一个请求创建一个链接并得到一个返回数据
   
NSData *data = [NSURLConnectionsendSynchronousRequest:requestreturningResponse:nilerror:nil];
   
NSMutableDictionary *dataDic = [NSJSONSerializationJSONObjectWithData:dataoptions:(NSJSONReadingMutableContainers)error:nil];
   
// 剥香蕉
   
NSLog(@"%@", dataDic);
   
}
2.POST异步
// 异步
- (
void)actionRightButton:(UIBarButtonItem*)rightButton
{
   
// 1. 利用网址创建一个url网址对象
   
   
NSURL *url = [NSURLURLWithString:kNewsListURL];
   
   
   
// 2. 利用网址对象 创建请求
   
   
NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:urlcachePolicy:(NSURLRequestUseProtocolCachePolicy)timeoutInterval:30];
   
// 3. 设置请求的类型
   
    [request
setHTTPMethod:@"POST"];
   
// 4. 给这个请求设置请求体
    [request
setHTTPBody:[kNewsListParamdataUsingEncoding:NSUTF8StringEncoding]];
   
// 5. 利用请求 创建链接 利用代理方法 实现异步请求数据
  
// (1)block方法
   
//    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
//        NSMutableDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil];
//        NSLog(@"========%@", dataDic);
//    }];
   
// (2)代理方法
   
   
self.connection= [NSURLConnectionconnectionWithRequest:requestdelegate:self];
   
// 开启链接
    [
self.connectionstart];
}

- (
void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response
{
   
self.data= [NSMutableDatadata];
   
NSLog(@"返回服务器信息,声明链接成功了");
}

- (
void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data
{
    [
self.dataappendData:data];
   
NSLog(@"每次返回一点数据多次执行");
}

- (
void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error
{
   
NSLog(@"请求失败,错误信息");
}


- (
void)connectionDidFinishLoading:(NSURLConnection*)connection
{
   
NSMutableDictionary *dataDic = [NSJSONSerializationJSONObjectWithData:self.dataoptions:(NSJSONReadingMutableContainers)error:nil];
   
NSLog(@"%@", dataDic);

   
NSLog(@"完成请求此时可以进行数据解析");
}
3. Get POST 的区别
    1). get
请求请求的网站全部明文显示  (安全性不高)
    2). get
请求有字符数的限制 (255)
    3). post
请求请求的网址不光是有一个请求的网址 还可以携带请求体 这个请求体 是以nsdata形式携带 所以安全性较高
    4). post
请求没有字符数限制
 
   一般公司都是用post请求,安全性高点.

三.图片链接加载(异步)
@interfaceImageViewController ()<NSURLConnectionDelegate,NSURLConnectionDataDelegate>
@property(nonatomic,retain)UILabel*label;
@property(nonatomic,retain)UIImageView*imageView;
@property(nonatomic,retain)NSURLConnection*connection;
@property(nonatomic,retain)NSMutableData*data;
//定义一个属性记录总大小的
@property(nonatomic,assign)longlong totalLength;
@end

@implementationImageViewController
- (
void)dealloc
{
    [
_connectioncancel];
    [
_connectionrelease];
    [
_labelrelease];
    [
_imageViewrelease];
    [
_datarelease];
    [
superdealloc];
}
- (
void)viewDidLoad {
    [
superviewDidLoad];
   
   
self.navigationItem.title= @"Image";
   
UIBarButtonItem *leftButton = [[UIBarButtonItemalloc]initWithTitle:@"加载图片"style:(UIBarButtonItemStylePlain)target:selfaction:@selector(actionLeftButton:)];
   
self.navigationItem.leftBarButtonItem= leftButton;
    [
selfaddSubView];
   
// Do any additional setup after loading the view.
}
- (
void)addSubView
{
   
self.imageView= [[UIImageViewalloc]initWithFrame:[self.viewbounds]];
    [
self.viewaddSubview:self.imageView];
   
self.imageView.backgroundColor= [UIColorblackColor];
   
self.label= [[UILabelalloc]initWithFrame:CGRectMake(100,100,100,40)];
   
self.label.textAlignment= NSTextAlignmentCenter;
   
self.label.backgroundColor= [UIColorgrayColor];
    [
self.imageViewaddSubview:self.label];
    [
_imageViewrelease];
    [
_labelrelease];
}

//请求用什么方法

- (
void)actionLeftButton:(UIBarButtonItem*)button
{
    [
selfsetUpDataGet];
}

- (
void)setUpDataGet
{
   
NSURL *url = [NSURLURLWithString:kImageURL];
   
NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:urlcachePolicy:(NSURLRequestUseProtocolCachePolicy)timeoutInterval:30];
    [request
setHTTPMethod:@"GET"];
   
self.connection= [NSURLConnectionconnectionWithRequest:requestdelegate:self];
   
}

- (void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error
{
   
}
- (
void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response
{
   
self.data= [NSMutableDatadata];
   
NSLog(@"开始,链接成功");
   
// 获取图片的大小
  
self.totalLength= response.expectedContentLength;
}
- (
void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data
{
    [
self.dataappendData:data];
   
// 利用data加载图片
   
self.imageView.image= [UIImageimageWithData:self.data];
   
NSLog(@"一点一点传");
   
   
// 计算图片加载进度
   
_label.text= [NSStringstringWithFormat:@"%f", (float)self.data.length/ self.totalLength];
   
}
- (
void)connectionDidFinishLoading:(NSURLConnection*)connection
{
   
   
NSLog(@"完成");
}


四.prefixHeader文件

将头文件 或者 宏定义都写在这个文件里面
 改路径  




















0 0
原创粉丝点击