HTTP 协议 -- iOS开发网络开发

HTTP 协议 相关概念

与HTTPS
一 HTTP协议概念

HTTP(Hypertext Transfer Protocol[超文本传输协议]) 是一个无状态的面向对象的一个应用层协议, 由请求和响应构成, 完成超文本数据从网络端到客户端的传输,HTTP协议是一个标准的客户端服务器模型. 

二 HTTP协议的特点:

  1. 支持客户/服务器模式
  2. 简单快速
  3. 灵活: HTTP支持任意类型的对象传输正在传输的对象类型有Content-type加以标记
  4. HTTP协议1.1版本后继续使用持续链接
  5. 无状态: HTTP协议是一种无状态协议

三 HTTP协议的作用

  1. 规定客户端和服务器端之间的数据传输格式
  2. 让客户端和服务器端有效的进行沟通

四 HTTP下得通信过程

  1. 请求: 客户端向服务器端所要数据
HTTP协议规定:1个完整的由客户端发给服务器的HTTP请求中包含以下内容

请求行:包含了请求方法、请求资源路径、HTTP协议版本

GET /MJServer/resources/images/1.jpg HTTP/1.1

请求头:包含了对客户端的环境描述、客户端请求的主机地址等信息

Host: 192.168.1.105:8080 // 客户端想访问的服务器主机地址

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9) Firefox/30.0// 客户端的类型,客户端的软件环境

Accept: text/html, */*// 客户端所能接收的数据类型

Accept-Language: zh-cn // 客户端的语言环境

Accept-Encoding: gzip // 客户端支持的数据压缩格式

请求体:客户端发给服务器的具体数据,比如文件数据
  1. 响应: 服务器端向客户端返回数据
客户端向服务器发送请求,服务器应当做出响应,即返回数据给客户端

HTTP协议规定:1个完整的HTTP响应中包含以下内容:

状态行:包含了HTTP协议版本、状态码、状态英文名称

HTTP/1.1 200 OK

响应头:包含了对服务器的描述、对返回数据的描述

Server: Apache-Coyote/1.1 // 服务器的类型

Content-Type: image/jpeg // 返回数据的类型

Content-Length: 56811 // 返回数据的长度

Date: Mon, 23 Jun 2014 12:54:52 GMT // 响应的时间

实体内容:服务器返回给客户端的具体数据,比如文件数据       

常见的状态码

五 HTTP 协议常见的请求方式

  1. 同步GET请求~ 异步GET请求
  2. 同步POST请求~ 异步POST请求

六 发送HTTP请求的方法
**
1.简单说明

在HTTP/1.1协议中,定义了8种发送http请求的方法

GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH

根据HTTP协议的设计初衷,不同的方法对资源有不同的操作方式

PUT :增

DELETE :删

POST:改

GET:查

提示:最常用的是GET和POST(实际上GET和POST都能办到增删改查)

**

六 iOS中发送HTTP请求的方案

在iOS中,常见的发送HTTP请求(GET和POST)的解决方案有

(1)苹果原生(自带)

NSURLConnection:用法简单,最古老最经典最直接的一种方案

NSURLSession:iOS 7新出的技术,功能比NSURLConnection更加强大

CFNetwork:NSURL*的底层,纯C语言

(2)第三方框架

ASIHttpRequest:外号“HTTP终结者”,功能极其强大,可惜早已停止更新

AFNetworking:简单易用,提供了基本够用的常用功能

建议:

为了提高开发效率,企业开发用的基本是第三方框架

网络请求的使用

  • NSURL 这个类封装了一个网络路径
  • NSURLRequest 我们通过这个设置一些网络的请求信息
  • NSURLMutableURLRequest 这个类时NSURLRequest的子类, 可以设置一些请求的参数
  • NSURLResponse 这个类包含了一些从服务器返回的信息
  • NSError 这个类包含了我们在网络请求中遇到的错误信息
    1. 同步/异步
      1.1 同步下载的操作步骤实例
1> 创建NSURL
NSURL *url = [[[NSURL alloc] initWithString: @"http//best50.cn"];
    2> 通过URL创建NSURLRequest
 NSURLRequest *URLRequest = [NSURLRequest requestWithURL:URLObject]; //默认 GET 请求
  //NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url cachesPolicy: //NSURLRequestUserProtocolCachePolicy  timeoutInterval: 15];
//第一个参数为访问路径, 第二个参数为:缓存协议 第三个参数为网络请求超时时间(秒)
    3> 建立网络连接NSURLConnection, 同步请求数据
//NSData *receivedData = (NSMutableData *)[NSURLConnection sendSynchronousRequest:request //retruningResponse: &response error :&error];
//其中response为NSURLResponse 类的对象, 用于接收服务器返回的响应, error 为NSError类, 用于接收网络访问过程出现的错误信息
 //声明response
    NSHTTPURLResponse *HTTPResponse = nil;
//    NSData *receivedData = [NSURLConnection sendSynchronousRequest:URLRequest returningResponse:&HTTPResponse error:nil];

    4>数据解析

1.2 异步下载的操作步骤实例

1) 创建NSURL
NSURL *url = [NSURL URLWithString:@""];
2) 通过URL创建NSURLRequest
NSURLRequest *URLRequest = [NSURLRequest requestWithURL:URLObject];
//NSURLRequest *request = [[NSRULRequest alloc] initWitURL:url cachePlicy: //NSURLRequestUseProtocolCachePolicy timeoutInterval: 15];
3)建立网络连接NSURLConnection, 并设置代理
[NSURLConnection connectionWithRequest: request  delegate: self];
4) 需要实现的代理:  NSURLConnectionDataDelegate, NSURLConnectionDelegate

代理方法  1>
接收到服务器回应的时候调用此方法
- (void) connection:(NSURLConnection *)connection didREceiveReponse:(NSURLReponse *)reponse
{
     NSLog(@"%@",response);//当服务器端正确响应请求后, 会在响应消息的报头部分提供一些数据, 不如需要被下载的文件的总大小
    NSLog(@"%s",__FUNCTION__);//根据HTTP协议的原理, 客户端在发出请求后, 如果得到服务器端的响应, 会执行此方法, 表示数据下载即将开始.
}
代理方法   2>
当前网络链接建立成功后, 就开始不断的获取服务器端传输的数据;
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
     [self.receivedData appendData:data];
}
代理方法 3>
数据传送完后调用此方法
- (void) connectionDidFinishLoading:(NSURLConnection *)connection
{
        //此方法可以得到最终的receivedData
}
代理方法   4>
网络请求中出现任何错误, 会进入此方法
- (void) connection:(NSURLConnection *)conncetion didFailWithError:(NSError *)error    {}

1.3 对比

    同步请求会阻塞主线程, 会使用户失去UI交互, 出现程序卡死的情况, 只有在同步下载结束后, UI才可以接收用户的交互
异步请求即使用多线程, 两者互不影响

2. GET请求 和 POST请求
特点
* GET请求:参数都写在访问路径上了
* POST请求:请求参数都放在body里面了
* GET请求: 操作简单, 所有参数直接写到地址里面就可以了, POST:操作相对复杂, 需要将参数和地址分开写
* GET请求:参数容易被外界看到, 安全性不高 POST请求: 参数都放在了body里面了, 所有不易被捕获, 安全性高
* GET请求:地址最多长度限制为255字节,多余的部分会被截掉 POST请求: 因为参数都在body中, 所有不存在限制问题

2.1 GET请求操作步骤

1) 设置请求路径
 NSURL *url = [NSURL URLWithString:@""];

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

3) 发送请求

2.1 POST请求操作步骤

1) 设置请求路径
 NSURL *url = [NSURL URLWithString:@""];

2) 创建一个请求 (NSURLRequest), 把访问地址放到请求里面
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: url];

3)设置请求方式      不设置的话默认为GET请求(GET请求)
[request setHTTPMethod:@"POST"];

4) 设置参数体

a,将参数转化为NSData类型
NSData *postData = [arguments dataUsingEncoding:NSUTF8StringEncoding];
NSString*arguments = [NSString stringWithFormat:@""];

b. 将NSData类型的参数放入请求体中
[request setHTTPBody:postData];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值