一、一个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) {
> 处理服务器返回的数据
}];

五、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 = ;
// 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.监控网络状态

> 监听通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkStateChange) name:kReachabilityChangedNotification object:nil]; > 开始监听网络状态
// 获得Reachability对象
self.reachability = [Reachability reachabilityForInternetConnection];
// 开始监控网络
[self.reachability startNotifier]; > 移除监听
[self.reachability stopNotifier];
[[NSNotificationCenter defaultCenter] removeObserver:self];

【iOS基础】iOS 网络请求的更多相关文章

  1. iOS基础之网络请求相关

    1.AFNetwork二次封装方法一: #import <Foundation/Foundation.h> @interface BeeNetworkManager : NSObject ...

  2. iOS美丽约网络请求分析

    网络请求分析html, body {overflow-x: initial !important;}html { font-size: 14px; } body { margin: 0px; padd ...

  3. iOS基础 - 第三方网络框架

    一.iOS网络层次结构 基于iOS提供API实现上传文件和断点续传的思路 常用iOS第三方网路框架简介 AFNetworking(AFN) ASIHTTPRequest(ASI) 另外一个常用框架 S ...

  4. iOS基础 - iOS网络基础

    一.网络访问的四个步骤 l 第一步:确定地址URL l 第二步:建立请求 l 第三步:建立并启动连接 l 第四步:连接完成,处理结果 备注:URL,统一资源定位符(URL,英语Uniform Reso ...

  5. iOS 串行网络请求。。。待研究

    nsurlsession 和 nsurlconnection 能实现吗? 手动实现的关键点在哪里? 我这里说的串行网络请求,指的是第一个网络请求不返回数据,第二个网络请求就不能开始. AFNetwor ...

  6. ios编程之网络请求

    网络请求有GET请求和POST请求,get和post实现的时候可以选择同步或者异步实现.看一个请求是GET还是POST就看网址后面有没有携带请求体. GET与POST 区别  1.get请求 请求的网 ...

  7. iOS中的网络请求 和 网络监测

    1.网络监测 //根据主机名判断网络是否连接 Reachability *reach = [Reachability reachabilityWithHostName:@"www.baidu ...

  8. iOS开发之网络请求(基于AFNetworking的再封装)

    最近一直很忙也没有什么时间写博客了.放假了休息一下,就写一篇博客来总结一下最近做项目中出现过的问题吧!!! 首先,在项目中我的起到了什么作用,无非就是把美工(UI设计师)给我们的图显示出来,然后再和服 ...

  9. ios中封装网络请求类

    #import "JSNetWork.h" //asiHttpRequest #import "ASIFormDataRequest.h" //xml 的解析 ...

  10. iOS -读书笔记-网络请求

    知道"3次握手"吗?突然想起这个词 什么是3次握手? TCP三次握手/四次挥手详解 这里是3次握手的详解 3次握手就是为了可靠的传送数据,TCP(什么是TCP呢?TCP就是一种可靠 ...

随机推荐

  1. Python迭代--笔记

    <python3 程序开发指南> 迭代子.迭代操作 迭代子是一个对象,该对象可提供_next_()方法,该方法依次返回每个相继的数据项,并在没有数据项时产生StopIteration()异 ...

  2. JPush 极光推送 消息推送 实例

    简介 官网:https://www.jpush.cn/ 极光推送(JPush)是一个端到端的推送服务,使得服务器端消息能够及时地推送到终端用户手机上,让开发者积极地保持与用户的连接,从而提高用户活跃度 ...

  3. MVC4建立DBContext的EF6数据

    MVC4建立DBContext的EF6数据时 1.需要using System.Data.Entity;命名空间 2.此命名空间需要安装EntityFromwork.dll,此dll可以在项目——&g ...

  4. 让 IE 支持HTML5 placeholder

    HTML5 新增的placeholder属性已经得到现代浏览器的支持,旨在提供简单的API可以为文本输入框设置 描述输入字段预期值的提示信息(hint). 这是W3C在标准化的过程中对用户体验的更多考 ...

  5. java关键字 (jdk6),各自的含义是什么?

    Abstract 抽象的 一个Java语言中的关键字,用在类的声明中来指明一个类是不能被实例化的,但是可以被其它类继承.一个抽象类可以使用抽象方法,抽象方法不需要实现,但是需要在子类中被实现. bre ...

  6. C++朝花夕拾【更新】

    C++拾遗 更新一些平时遇到的小细节: 1.关于类的无参构造函数和带有全部默认参考值的构造函数的区别 书上说的是带有全部默认值的构造函数就是无参构造函数,私以为不以为然,来看下边这个例子: #incl ...

  7. crtmpserver组网方案

    A Powerful Live Streaming Setup 搭建强大的直播系统 Recently we had a project requiring live streaming setup, ...

  8. ThinkPHP实现RBAC

    RBAC: role base access control   基于角色的用户访问权限控制 不同人员登录系统要显示不同的菜单项目 1.传统方式权限设置: 具体操作权限与用户直接联系:

  9. Web 前端开发者必知CSS 属性

    1.  圆角效果 如今的Web设计在不断跟进最新的开发技术,纷纷采用HTML5来开发多样性的Web应用.HTML5的优势之一,就是之前必须用图片实现的元素,现在可以用代码来实现. “border-ra ...

  10. memcache的使用

    什么是memcache? Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果等. ...