iOS网络请求方式

四种请求方式

  • HTTP协议申明了客户端与服务端交互的方式,即请求方式:
    GET、POST、PUT 、DELETE
    • PUT:向指定资源位置上传其最新内容
    • DELETE:请求服务器删除Request-URI所标识的资源。
  • 这四种方式可以对网络资源(url描述的内容)进行:查、改、增、删

常用的两种请求方式

  • GET
    • 从指定服务器获取数据

      • 请求时一般会提交服务器一些请求参数,附加在URL上的,参数之间以&分割
      • URL中英文和数字原样识别,而中文或者一些其他字符需要编码
      • GET请求提交的数据一般放在HTTP协议的头Header中
    • 特点:

      • GET请求能够被缓存
      • GET请求会保存在浏览器的浏览记录中
      • 以GET请求的URL能够保存为浏览器书签
      • GET请求有长度限制
      • GET请求不安全
  • POST
    • 上传数据改变服务器内容
      • POST请求多用于给服务器提交数据
      • POST请求提交的数据一般放在HTTP的主体数据包Body中
    • 特点:
      • POST请求不能被缓存
      • POST请求不会保存在浏览器的浏览记录中
      • 以POST请求的URL无法保存为浏览器书签
      • POST请求没有长度限制
      • 相对于GET请求来说,POST请求更安全
  • 两者区别
    • 请求提交的数据在HTTP中位置不同
    • 长度限制不同
    • 安全性不同
      • 由于GET请求的数据附加在URL上,所以提交的数据是可以看见的,数据包被拦截后也是明文的,再加上浏览器的历史记录也会被人看见,提交是用户名和密码就很不安全
      • POST提交的数据实在body体中,相对安全性更高
  • 选择GET和POST的建议:
    • 如果要传递大量数据,比如文件上传,只能用POST请求
    • GET的安全性比POST要差些,如果包含机密\敏感信息,建议用POST
    • 在做数据查询时,建议用GET方式;而在做数据添加、修改、下载或删除时,建议用POST方式

HTTP网络请求的结构

  • 请求头
    • 客户端发出的网络请求的“头”部分
    • 请求头一般包含一些简单的配置信息,例如客户端信息,是GET请求还是POST请求等等。
  • 请求体
    • 客户端发出的网络请求的“身体”部分
    • 具体要请求的内容的正文,以及一些提交给服务器的保密内容,例如用户名和密码
  • 响应头
    • 服务器返回的数据的配置信息,例如数据类型,响应结果,响应码等零碎的信息
    • 在代码中一般表达为response这个变量
  • 响应体
    • 服务器返回的数据的具体内容(一般由服务器分段返回)
    • 在代码中一般表达为data这个变量

网络请求的方式分类

   **同步请求**(一旦发出同步请求,如果服务器不响应,就算你等到天荒地老客户端也不会继续执行后续操作,一般开发中不建议使用)
   具体的请求代码如下所示:

 先创建URL对象
 NSURL *url = [NSURL URLWithString:@"http://dl_dir.qq.com/qqfile/qq/QQforMac/QQ_V2.4.1.dmg"];

/*
 第1种方法
 */
NSString *string = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

/*
 第2种方法
 */
NSData *data = [NSData dataWithContentsOfURL:url];

/*
 第3种方法(使用NSURLConnection发送同步请求)
 */
3.1 创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
3.2 发送同步请求
[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

   异步请求(一旦请求发出,不用等服务器有响应就能继续后续操作,开发中最常用的请求)
   具体的请求代码如下所示:

/*
 第1种方法
 */
1.1 创建URL对象
NSURL *url = [NSURL URLWithString:@"http://dl_dir.qq.com/qqfile/qq/QQforMac/QQ_V2.4.1.dmg"];

1.2 创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];

1.3 发送异步请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
    NSLog(@"请求完成");
}];
/*
    第2种方法 (使用NSURLConnection的代理方法)
    步骤:发送网络请求 + 实现四个代理方法
*/
     2.1 创建请求对象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
     2.2 发送异步请求, 并绑定其代理为self
 [NSURLConnection connectionWithRequest:request delegate:self];
 
     2.3 实现第一个代理方法(只有在收到服务器响应时会触发)
     //注意:参数response即服务器返回的响应头, 包含返回数据的各种信息, 如文件名,文件大小,文件类型
     - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    //1. 清空数据 
    (事先定义一个全局变量_downloadData来保存请求下来的数据)
    (在保存数据之前, 为了防止和上一次请求的数据发生混合, 应该先清除上一次的数据)
    self.downloadData.length = 0;
    
    //2. 获取文件总大小
    self.allSizeBytes = response.expectedContentLength;
    
    //3. 获取文件名字
    NSString *filename = response.suggestedFilename;
    NSLog(@"文件名字:%@",filename);

    
    //4. 获取文件类型
    NSString *type = response.MIMEType;
    NSLog(@"文件类型:%@",type);
    
    //5. 获取状态码
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
    NSInteger statusCode = httpResponse.statusCode;
    NSLog(@"状态码:%ld",statusCode);
}
    2.4 实现第二个代理方法(接受服务器传过来的数据) 
服务器会分段把数据传给客户端, 因此该方法可能会走多次.
 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
//叠加数据
[self.downloadData appendData:data];
 }
     2.5 实现第三个代理方法(下载完成了会触发)
    (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"下载完成");
    //将下载完成的数据复制给图片
    self.image = [UIImage imageWithData:self.downloadData];
}
2.6 实现第四个代理方法(下载失败时触发)
-  (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"下载失败--%@",error);
}

注意

  • 要对包含中文的URLString先进行转码,具体代码如下所示:
 先对URLString进行UTF8编码 --> 再转换成URL
      
      NSString *urlString = @"https://api.douban.com/v2/book/search?q=开发" 
      urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
      NSURL *url = [NSURL URLWithString:urlStr];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值