美文网首页
网络编程(01)NSURLConnection

网络编程(01)NSURLConnection

作者: Rui哥 | 来源:发表于2018-03-13 06:55 被阅读9次
网络分层结构.png http 通信流程.png

一 GET请求和POST请求的区别

  • GET请求和POST请求的区别主要是体现在数据的传递上.

  • GET请求相对于POST请求是不安全的

  • GET请求:
    在请求的URL后面一 '?'的形式跟上发给服务器的参数,多个参数之间以'&'隔开比如:

    http://www.baidu.com/login?usrName=zhangsan&pwd=123456&type=json
    

    由于浏览器和服务器对URL的长度有限制,因此在URL后面附带参数是由限制的,通常不超多1kb.

  • POST 请求
    发送个服务器的参数全部放在请求体
    理论上POST请求体传递的数据是没有限制的

二 HTTP请求过程----请求

HTTP 协议规定: 一个完整的由客户端发送给服务器的HTTP 请求中包含以下内容.

  • 请求头 包含了 对客户端的环境描述,客户端的请求信息等.
GET /xiaoming.png HTTP/1.1     // 包含了请求方法  请求路径  HTTP协议的版本
Host: 120.25.226.186:12345   // 客户端想访问服务器的主机地址
User-Agent: Mozilla/5.0          //客户端的类型,客户端的软件环境
Accept: text/html                    // 客户端所能接受的数据类型
Accept-Language: zh cn       //客户端语言环境
Accept-Encoding: gzip          //客户端支持的数据压缩格式 
  • 请求体: 客户端 发送给服务器的具体数据,比如文件数据. (请求体不是必须的,比如GET请求)

二 HTTP请求过程----相应

  • 客户端服务器 发送请求,服务器应当做出相应,即返数据给客户端
  • HTTP协议规定: 1个完整的相应体中应包含以下几个部分:
    响应头:包含对服务器的描述,对返回数据的描述
    HTTP/1.1 200 ok    //http 的版本  状态
    Server: Apache-Coyote/1.1  // 服务器的类型
    Content-Type: image/jpeg  // 返回数据的类型
    Content-Length: 56811   //返回数据的长度
    Date: Mon jun 2015 12:29:53 GMT  // 相应时间
    
    响应体 服务器返给客户端的具体数据,比如文件数据

三 HTTP请求状态码类别含义

类别 原因短语 解释 比如
1xx开头 信息性状态码 接收的请求正在处理
2xx开头 成功状态码 请求正常处理完毕 比如:200 表示成功
3xx开头 重定向状态码 要完成附加请求操作以完成请求
4xx开头 客户端错误 客户端错误 比如:404 请求路径错误,客户端传错了
5xx开头 服务端错误 服务端错误 比如:500 服务器出错

四 iOS中HTTP GET 请求

  • NSURLConnection 发送同步请求 GET
-(void)sendsync{
    
    // 1. 确定请求路径 (GET 请求: 基础路劲 + 参数)
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:12345/logo?usr=zhangsan&pwd=123456"];
    
    // 2. 创建请求对象 (该对象内部会默认 生成请求头), GET 请求没有请求体
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    // 3. 发送请求
    NSURLResponse *response = nil; // 响应头
    NSError *err = nil;
    // 4.返回请求的响应数据
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
    
    NSLog(@"data : %@",data);
}

  • NSURLConnection 发送异步请求 GET
- (void)sendAsync{
    
    // 1. 确定请求路径 (GET 请求: 基础路劲 + 参数)
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:12345/logo?usr=zhangsan&pwd=123456"];
    
    // 2. 创建请求对象 (该对象内部会默认 生成请求头), GET 请求没有请求体
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    // 3. 发送请求synchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { // 响应数据
        
        NSLog(@"response: %@, data: %@,connectionError : %@",response, data, connectionError);
    }];
}
  • NSURLConnection 发送请求 代理接收响应数据 GET
@interface TestViewController ()<NSURLConnectionDataDelegate>

@end

@implementation TestViewController

- (void)sendAsyncDelegate{
    
    // 1. 确定请求路径 (GET 请求: 基础路劲 + 参数)
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:12345/logo?usr=zhangsan&pwd=123456"];
    
    // 2. 创建请求对象 (该对象内部会默认 生成请求头), GET 请求没有请求体
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    // 3. 发送请求
    [[NSURLConnection alloc] initWithRequest:request delegate:self];

    //startImmediately:NO 时,不会立即发送请求需要手动调用start 发送请求
    //NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
    //[connection start];
}


#pragma mark- NSURLConnectionDataDelegate
// 1 接收到相应头调用
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{

}

//2.接收到数据调用, 该方法可能被调用多次
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    
}
// 3. 完成后调用
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    
}

//4. 失败时调用
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    
}

五 iOS中HTTP POST 请求

- (void)sendAsyncPOST{
    
    // 1. 确定请求路径 (GET 请求: 基础路劲 + 参数)
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:12345/logo"];
    
    // 2. 创建请求对象 (该对象内部会默认 生成请求头)
    NSMutableURLRequest  *request = [NSMutableURLRequest requestWithURL:url];
    // 2.1如果请求头的信息不满足可以自己修改
    [request setValue:@"ios 10.2" forHTTPHeaderField:@"User-Agent"];
    // 2.2设置请求超时时间
    request.timeoutInterval = 15;
    
    //3.设置请求方式
    request.HTTPMethod = @"POST";
    //4.设置请求体
    request.HTTPBody = [@"usr=zhangsan&pwd=123456" dataUsingEncoding:NSUTF8StringEncoding];
    
    
    // 3. 发送请求
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        // 处理相应信息
    }];
    
}

五 URL转码

在使用URL的时候,如果字符串中设计到中文,那么需要对中文进行转码

NSString *urlStr = @"http://120.25.226.186:12345/logo?usr=张三&pwd=12345"; 
NSURL *url = [NSURL URLWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

相关文章

网友评论

      本文标题:网络编程(01)NSURLConnection

      本文链接:https://www.haomeiwen.com/subject/zfnvfftx.html