zoukankan      html  css  js  c++  java
  • iOS开发-HTTP请求

    • 什么是URL?
      URL就是资源的地址、位置,互联网上的每个资源都有一个唯一的URL
      URL的基本格式:


    • URL中常见的协议

      (1)HTTP

      超文本传输协议,访问的是远程的网络资源,格式是http://

      http协议是在网络开发中最常用的协议

      (2)file

      访问的是本地计算机上的资源,格式是file://(不用加主机地址)

      (3)mailto

      访问的是电子邮件地址,格式是mailto:

      (4)FTP

      访问的是共享主机的文件资源,格式是ftp://

    • HTTP请求示例,返回JSON
          // 1.拼接一个请求路径,请求参数跟在URL的后面以?隔开,多个参数之间以&符号拼接
          NSString *httpUrl = [NSString stringWithFormat:@"https://free-api.heweather.com/v5/weather?city=%@&key=XXX",[cityName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
        //2.创建一个请求 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:httpUrl]]; //3.将请求的url数据放到NSData对象中(同步请求,在主线程下载数据,执行时间根据数据大小变化) NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; //4.解析数据,根据请求返回的类型,这里用IOS5自带解析类NSJSONSerialization从response中解析出数据放到字典中 NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:nil];

      异步请求

      // 3.发送异步请求,收到返回数据后回到主线程执行任务
          [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
              if (connectionError || data == nil) {
                  NSLog(@"网络繁忙,请稍后尝试");
              }
              // 4.解析数据,根据请求返回的类型,这里用IOS5自带解析类NSJSONSerialization从response中解析出数据放到字典中
              NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
          }];
    • HTTP请求返回XML

      一、XML简单介绍

      XML:全称是Extensible Markup Language,译作“可扩展标记语言”

      跟JSON一样,也是常用的一种用于交互的数据格式,一般也叫XML文档(XML Document)

      XML举例

      <videos>

          <video name="小黄人 第01部" length="30" />

          <video name="小黄人 第02部" length="19" />

          <video name="小黄人 第03部" length="33" />

      </videos>

      二、XML的语法

      1.简单说明

      一个常见的XML文档一般由以下部分组成

      文档声明

      元素(Element)

      属性(Attribute)

      2.文档声明

      在XML文档的最前面,必须编写一个文档声明,用来声明XML文档的类型

      最简单的声明

      <?xml version="1.0" ?>

      用encoding属性说明文档的字符编码

      <?xml version="1.0" encoding="UTF-8" ?>

      3.XML语法 – 元素(Element)

      一个元素包括了开始标签和结束标签

      拥有元素内容:<video>小黄人</video>

      没有元素内容:<video></video>

      没有元素内容的简写:<video/> 

      一个元素可以嵌套若干个子元素(不能出现交叉嵌套)

      <videos>

          <video>

              <name>小黄人 第01部</name>

               <length>30</length>

          </video>

      </videos>

      注意:

      (1)规范的XML文档最多只有1个根元素,其他元素都是根元素的子孙元素

      (2)XML中的所有空格和换行,都会当做具体内容处理

      下面两个元素的内容是不一样的

      第1个

      <video>小黄人</video>

      第2个

      <video>

          小黄人

      </video>

      4.XML语法 – 属性(Attribute)

      一个元素可以拥有多个属性

      <video name="小黄人 第01部" length="30" />            ---->video元素拥有name和length两个属性

      注意:属性值必须用 双引号"" 或者 单引号'' 括住

      实际上,属性表示的信息也可以用子元素来表示,比如

      <video>

          <name>小黄人 第01部</name>

              <length>30</length>

      </video>

      三、XML的解析

      1.简单说明

      要想从XML中提取有用的信息,必须得学会解析XML

      提取name元素里面的内容

      <name>小黄人 第01部</name>

      提取video元素中name和length属性的值

      <video name="小黄人 第01部" length="30" />

      XML的解析方式有2种

      (1)DOM:一次性将整个XML文档加载进内存,比较适合解析小文件

      (3)SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件

      2.IOS开发中XML的解析

      在iOS中,解析XML的手段有很多

      (1)苹果原生   NSXMLParser:SAX方式解析,使用简单

      (2)第三方框架

      1)libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX方式解析

      2)GDataXML:DOM方式解析,由Google开发,基于libxml2

      XML解析方式的选择建议:

      大文件:NSXMLParser、libxml2

      小文件:GDataXML

      用GDataXML解析XML数据



      用NSXMLParser解析


      实现<NSXMLParserDelegate>的代理方法




    • HTTP的GET请求和POST请求
      >GET: 1、在请求url后面以?的形式跟上发给服务器的参数,多个参数之间用&隔开,
      比如 http://www.test.com/login?username=123&pwd=234&type=JSON
                2、由于浏览器和服务器对URL长度有限制,因此在URL后面附带的参数是限制的,通常不能超过1kb

      >HTTP:1、发给服务器的参数全部放在请求体中
                 2、理论上,POST传递的数据量没有限制(具体还得看服务器的处理能力)

      选择:1).如果要传递大量数据,比如文件上传,只能用post请求
             2).get的安全性比post要差些,如果包含机密敏感信息,建议用post
             3).如果仅仅是索取数据(数据查询),建议用get
             4).如果是增加、修改、删除数据,建议使用post
    • GET和POST的区别:http://www.techweb.com.cn/network/system/2016-10-11/2407736.shtml

      GET请求上面已经说到,这里就不累述了,下面主要写POST请求
      POST请求示例
         // 1.创建一个URL : 请求路径
          NSURL *url = [NSURL URLWithString:@"http://192.168.15.172:8080/MJServer/login"];
          
          // 2.创建一个请求,这里使用NSMutableURLRequest,因为要设置其他属性
          NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        
          // 3.(可选)设置超时时间,5s后算请求超时(默认60s超时)
          request.timeoutInterval = 5;
          
          request.HTTPMethod = @"POST"; // **设置请求的类型
          // 4.设置请求体
          NSString *param = [NSString stringWithFormat:@"username=%@&pwd=%@", usernameText, pwdText];
          // NSString --> NSData
          request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding];
          
          // 5.(可选)设置请求头信息
          [request setValue:@"iPhone 6" forHTTPHeaderField:@"User-Agent"];
          
          // 6.发送一个异步请求,收到数据后返回主线程执行任务
          [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:
           ^(NSURLResponse *response, NSData *data, NSError *connectionError) {
              // 这个block会在请求完毕的时候自动调用
              if (connectionError || data == nil) { // 一般请求超时就会来到这
                  [MBProgressHUD showError:@"请求失败"];
                  return;
              }
              
              // 解析服务器返回的JSON数据
              NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
      
           }];
    • 用POST发送JSON数据给服务器
          // 1.创建请求
          NSURL *url = [NSURL URLWithString:@"http://192.168.1.200:8080/MJServer/order"];
          NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
          request.HTTPMethod = @"POST";
          
          // 2.设置请求头
          [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
          
          // 3.设置请求体
          NSDictionary *json = @{
                                 @"order_id" : @"123",
                                 @"user_id" : @"789",
                                 @"shop" : @"Toll"
                                 };
      
          // NSDictionary --> NSData
          NSData *data = [NSJSONSerialization dataWithJSONObject:json options:NSJSONWritingPrettyPrinted error:nil];
          request.HTTPBody = data;
          
          // 4.发送请求
          [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
      
      }
  • 相关阅读:
    GAE 随机获取实体
    纵观 jBPM:从 jBPM3 到 jBPM5 以及 Activiti5
    NetBeans 时事通讯(刊号 # 131 Jan 04, 2011)
    发现 Google Buzz 与 Google Code 进行了集成
    改良程序的 11 技巧
    《让子弹飞》向我们展现真实的革命
    有关STL中的容器和MFC的集合类型构造函数区别的一点思考
    GAE 随机获取实体
    改良程序的 11 技巧
    NetBeans 时事通讯(刊号 # 132 Jan 11, 2011)
  • 原文地址:https://www.cnblogs.com/jierism/p/6129442.html
Copyright © 2011-2022 走看看