zoukankan      html  css  js  c++  java
  • IOS http协议 总结

    HTTP协议
    1.面试题常见:聊一下HTTP协议(协议的完整的通信过程)

     

    ============================================================

     

    一、一个HTTP请求的基本要素

    1.请求URL:客户端通过哪个路径找到服务器

    2.请求参数:客户端发送给服务器的数据
    * 比如登录时需要发送的用户名和密码

    3.返回结果:服务器返回给客户端的数据
    * 一般是JSON数据或者XML数据


    二、基本的HTTP请求的步骤(移动客户端)

    1.拼接"请求URL" + "?" + "请求参数"
    * 请求参数的格式:参数名=参数值
    * 多个请求参数之间用&隔开:参数名1=参数值1&参数名2=参数值2
    * 比如:http://localhost:8080/MJServer/login?username=123&pwd=456

    2.发送请求

    3.解析服务器返回的数据


    三、JSON解析

    1.利用NSJSONSerialization类解析
    * JSON数据(NSData) --> Foundation-OC对象(NSDictionary、NSArray、NSString、NSNumber)
    + (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;

    2.JSON解析规律
    * { } --> NSDictionary @{ }
    * [ ] --> NSArray @[ ]
    * " " --> NSString @" "
    * 10 --> NSNumber @10


    四、NSURLConnection

    1.发布异步请求01--block回调
    + (void)sendAsynchronousRequest:(NSURLRequest*) request
        queue:(NSOperationQueue*) queue
        completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler
    * request : 需要发送的请求
    * queue : 一般用主队列,存放handler这个任务
    * handler : 当请求完毕后,会自动调用这个block

    2.利用NSURLConnection发送请求的基本步骤
    1> 创建URL
    NSURL *url = [NSURL URLWithString:@"http://4234324/5345345"];

    2> 创建request
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    3> 发送请求
    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:
     ^(NSURLResponse *response, NSData *data, NSError *connectionError) {
         4> 处理服务器返回的数据
     }];


    五、XML

    1.语法
    1> 文档声明
    <?xml version="1.0" encoding="UTF-8" ?>

    2> 元素
    3> 属性
    <videos>
        <video name="小黄人 第01部" length="10"/>
        <video name="小黄人 第01部" length="10"/>
    </videos>
    * videos和video是元素(节点)
    * name和length叫做元素的属性
    * video元素是videos元素的子元素

    2.解析
    1> SAX解析:逐个元素往下解析,适合大文件
    * NSXMLParser

    2> DOM解析:一口气将整个XML文档加载进内存,适合小文件,使用最简单
    * GDataXML


    六、HTTP的通信过程

    1.请求
    1> 请求行 : 请求方法、请求路径、HTTP协议的版本
    GET /MJServer/resources/images/1.jpg HTTP/1.1

    2> 请求头 : 客户端的一些描述信息
    * User-Agent : 客户端的环境(软件环境)

    3> 请求体 : POST请求才有这个东西
    * 请求参数,发给服务器的数据

    2.响应
    1> 状态行(响应行): HTTP协议的版本、响应状态码、响应状态描述
    HTTP/1.1 200 OK

    2> 响应头:服务器的一些描述信息
    * Content-Type : 服务器返回给客户端的内容类型
    * Content-Length : 服务器返回给客户端的内容的长度(比如文件的大小)

    3> 实体内容(响应体)
    * 服务器返回给客户端具体的数据,比如文件数据


    七、HTTP的请求方法

    1.GET
    1> 特点
    * 所有请求参数都拼接在url后面

    2> 缺点
    * 在url中暴露了所有的请求数据,不太安全
    * url的长度有限制,不能发送太多的参数

    3> 使用场合
    * 如果仅仅是向服务器索要数据,一般用GET请求

    4> 如何发送一个GET请求
    * 默认就是GET请求
    // 1.URL
    NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
    // 2.请求
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    // 3.发送请求
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
    }];

    2.POST
    1> 特点
    * 把所有请求参数放在请求体(HTTPBody)中
    * 理论上讲,发给服务器的数据的大小是没有限制

    2> 使用场合
    * 除开向服务器索要数据以外的请求,都可以用POST请求
    * 如果发给服务器的数据是一些隐私、敏感的数据,绝对要用POST请求

    3> 如何发送一个POST请求
    // 1.创建一个URL : 请求路径
    NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/login"];

    // 2.创建一个请求
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    // 设置请求方法
    request.HTTPMethod = @"POST";
    // 设置请求体 : 请求参数
    NSString *param = [NSString stringWithFormat:@"username=%@&pwd=%@", usernameText, pwdText];
    // NSString --> NSData
    request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding];


    八、NSMutableURLRequest的常用方法

    1.设置超时
    request.timeoutInterval = 5;
    // NSURLRequest是不能设置超时的,因为这个对象是不可变的


    九、URL转码

    1.URL中不能包含中文,得对中文进行转码(加上一堆的%)
    NSString *urlStr = [NSString stringWithFormat:@"http://localhost/login?username=喝喝&pwd=123"];
    urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    // urlStr == @"http://localhost/login?username=%E5%96%9D%E5%96%9D&pwd=123"


    十、数据安全

    1.网络数据加密
    1> 加密对象:隐私数据,比如密码、银行信息
    2> 加密方案
    * 提交隐私数据,必须用POST请求
    * 使用加密算法对隐私数据进行加密,比如MD5
    3> 加密增强:为了加大破解的难度
    * 对明文进行2次MD5 : MD5(MD5($pass))
    * 先对明文撒盐,再进行MD5 : MD5($pass.$salt)

    2.本地存储加密
    1> 加密对象:重要的数据,比如游戏数据

    3.代码安全问题
    1> 现在已经有工具和技术能反编译出源代码:逆向工程
    * 反编译出来的都是纯C语言的,可读性不高
    * 最起码能知道源代码里面用的是哪些框架

    2> 参考书籍:《iOS逆向工程》

    3> 解决方案:发布之前对代码进行混淆
    * 混淆之前
    @interface HMPerson :NSObject
    - (void)run;
    - (void)eat;
    @end

    * 混淆之后
    @interface A :NSObject
    - (void)a;
    - (void)b;
    @end


    十一、监测网络状态

    1.主动监测监测网络状态
    // 是否WIFI
    + (BOOL)isEnableWIFI {
        return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);
    }

    // 是否3G
    + (BOOL)isEnable3G {
        return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);
    }

    2.监控网络状态
    1> 监听通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkStateChange) name:kReachabilityChangedNotification object:nil];

    2> 开始监听网络状态
    // 获得Reachability对象
    self.reachability = [Reachability reachabilityForInternetConnection];
    // 开始监控网络
    [self.reachability startNotifier];

    3> 移除监听
    [self.reachability stopNotifier];
    [[NSNotificationCenter defaultCenter] removeObserver:self];

    ============================================================

     


    2.通信过程
    1> 请求
    * 客户端 --> 服务器
    * 请求的内容
    a. 请求行(请求方法HTTP协议请求资源路径)
    b. 请求头(描述客户端的信息)
    c. 请求体(POST请求才需要有, 存放具体数据)

    2> 响应
    * 服务器 --> 客户端
    * 响应的内容
    a. 状态行(响应行, 状态码)
    b. 响应头(服务器信息, 返回数据的类型, 返回数据的长度)
    c. 实体内容(响应体, 返回给客户端的具体内容)

    3.HTTP请求的方法
    1> GET
    * 参数都拼接在URL后面
    * 参数有限制

    2> POST
    * 参数都在请求体
    * 参数没有限制

    4.iOS中发送GETPOST请求的手段
    1> NSURLConnection
    * 发送一个同步请求
    + (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error;

    * 发送一个异步请求
    + (void)sendAsynchronousRequest:(NSURLRequest*) request
    queue:(NSOperationQueue*) queue
    completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler;

    * 代理的方法(异步)
    [NSURLConnection connectionWithRequest:request delegate:self];
    [[NSURLConnection alloc] initWithRequest:request delegate:self];
    [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];

    NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
    [conn start];

     

     

     

  • 相关阅读:
    一个 redis 异常访问引发 oom 的案例分析
    从粗放式到精益化编程
    又是一年校招
    xUtils框架的介绍(四)
    xUtils框架的介绍(三)
    hdu 4283 区间dp
    hdu 4632区间dp 回文字串计数问题
    poj 1651 区间dp
    NYOJ 石子合并(一) 区间dp入门级别
    区间dp 整数划分问题
  • 原文地址:https://www.cnblogs.com/liuwj/p/6607994.html
Copyright © 2011-2022 走看看