iOS开发基础40-网络编程之NSURLConnection
iOS 网络编程详解
在移动互联网时代,几乎所有移动应用都需要进行网络通信,以便与服务器交换数据,保持应用的实时更新。无论是社交应用、新闻应用还是电商应用,网络编程都是不可或缺的一部分。本文将详细介绍网络编程的基本概念、常见协议、HTTP通信过程、以及如何在iOS中发送HTTP请求,并重点介绍如何使用NSURLConnection和NSURLSession进行网络通信。
一、网络基础
1. 为什么要学习网络编程
在移动互联网时代,实时更新的数据是移动应用的核心特征。网络编程是实现数据实时更新的基础,以下是一些典型的应用场景:
- 新闻资讯:如网易新闻、新浪新闻。
- 视频播放:如优酷、爱奇艺。
- 音乐播放:如QQ音乐、酷狗音乐。
- 地图导航:如百度地图、高德地图。
- 电商购物:如淘宝、京东。
- 社交应用:如QQ、微信、微博。
2. 基本概念
- 客户端(Client):运行在用户设备上的应用,如iOS或Android应用。
- 服务器(Server):提供服务和数据的计算机。
- 请求(Request):客户端向服务器发送请求,索取数据。
- 响应(Response):服务器响应客户端的请求,返回数据。
作为移动开发工程师,我们主要关注客户端开发,但也需要了解基本的网络通信过程。
3. 服务器
服务器可以分为两种:
- 远程服务器:用于应用上线后的正式服务器,供全体用户使用。
- 本地服务器:用于开发和测试阶段,仅供内部人员使用,速度较快,有助于提高开发效率。
二、URL
1. 如何找到服务器
客户端通过URL找到想要连接的服务器。URL(Uniform Resource Locator)是统一资源定位符,通过URL可以找到互联网上唯一的一个资源。
2. URL的基本格式
URL的基本格式为:
协议://主机地址/路径
- 协议:定义了资源传输和查找方式,如HTTP、HTTPS、FTP。
- 主机地址:存放资源的服务器的IP地址或域名。
- 路径:资源在服务器中的具体位置。
3. 常见的URL协议
- HTTP:访问远程网络资源,格式为
http://
。 - HTTPS:安全的HTTP协议,格式为
https://
。 - FTP:访问共享主机的文件资源,格式为
ftp://
。 - FILE:访问本地计算机上的资源,格式为
file://
。
三、HTTP
1. HTTP协议简介
HTTP(Hypertext Transfer Protocol)是超文本传输协议,用于规定客户端和服务器之间的数据传输格式,使双方能够有效地进行数据通信。
2. HTTP协议的特点
- 简单快速:协议简单,通信速度快。
- 灵活:允许传输各种类型的数据。
- 非持续连接:HTTP 0.9和1.0版本使用非持续连接,每次连接只处理一个请求,服务器响应后立即断开连接。
3. HTTP的基本通信过程
一个完整的HTTP通信过程分为两个步骤:
- 请求:客户端向服务器发送请求。
- 响应:服务器处理请求并返回数据。
四、GET和POST
1. 发送HTTP请求的方法
HTTP/1.1协议定义了多种请求方法,包括GET、POST、PUT、DELETE等。最常用的请求方法是GET和POST。
2. GET和POST的对比
- GET请求:将参数附加在URL之后,适用于请求数据,传递参数有限制,通常不能超过1KB。
- POST请求:参数放在请求体中,适用于提交数据,没有传递数据量的限制。
3. GET和POST的选择
- 传递大量数据时使用POST。
- 涉及敏感信息时使用POST。
- 查询数据时使用GET。
- 修改、删除数据时使用POST。
五、iOS中发送HTTP请求的方案
1. 苹果原生方案
- NSURLConnection:已被
NSURLSession
取代,不推荐新项目使用。 - NSURLSession:功能强大,苹果推荐使用。
- CFNetwork:底层网络接口,使用C语言。
2. 第三方框架
- AFNetworking:简单易用,功能强大。
- Alamofire:AFNetworking的Swift版。
- MKNetworkKit:简单易用,但使用者较少。
3. 建议
为了提高开发效率,推荐使用NSURLSession
或第三方框架如AFNetworking
。
六、HTTP通信过程
1. HTTP请求
一个完整的HTTP请求包含以下内容:
- 请求头:包括请求方法、请求路径、HTTP版本、主机地址、客户端类型、可接受的数据类型等。
- 请求体:包括客户端发送的具体数据(POST请求中才会有)。
2. HTTP响应
一个完整的HTTP响应包含以下内容:
- 响应头:包括HTTP版本、状态码、状态描述、服务器类型、返回数据类型、数据长度、响应时间等。
- 响应体:服务器返回的具体数据。
七、NSURLConnection简介及基本使用
1. 常用类
- NSURL:请求地址。
- NSURLRequest:请求对象,包含请求方法、请求头、请求体、请求超时等信息。
- NSMutableURLRequest:NSURLRequest的可变子类。
- NSURLConnection:负责发送请求,建立连接,并处理响应数据。
2. NSURLConnection的使用步骤
- 创建NSURL对象,设置请求路径。
- 使用NSURL创建NSURLRequest对象,设置请求头和请求体。
- 使用NSURLConnection发送请求。
3. NSURLConnection发送请求
NSURLConnection常见的发送请求方法有三种:
- 同步请求
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error;
- 异步请求(使用block回调)
+ (void)sendAsynchronousRequest:(NSURLRequest*) request queue:(NSOperationQueue*) queue completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler;
4. 使用代理发送请求
NSURLConnection也可以通过代理方法发送请求:
- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate;
+ (NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate;
在startImmediately = NO的情况下,需要调用start
方法开始发送请求:
- (void)start;
5. NSURLConnectionDelegate
NSURLConnectionDataDelegate中的代理方法包括:
- 接收到服务器响应时调用
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
- 接收到服务器数据时调用
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
- 请求完成时调用
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;
- 请求出错时调用
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
6. NSMutableURLRequest
NSMutableURLRequest是NSURLRequest的子类,常用方法包括:
- 设置请求超时:
- (void)setTimeoutInterval:(NSTimeInterval)seconds;
- 设置请求方法:
- (void)setHTTPMethod:(NSString *)method;
- 设置请求体:
- (void)setHTTPBody:(NSData *)data;
- 设置请求头:
- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
7. 创建GET和POST请求
创建GET请求:
NSString *urlStr = @"http://example.com/login?username=test&pwd=password";
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlStr];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}];
创建POST请求:
NSURL *url = [NSURL URLWithString:@"http://example.com/login"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
request.HTTPBody = [@"username=test&pwd=password" dataUsingEncoding:NSUTF8StringEncoding];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}];
8. 常见HTTP响应状态码
响应码 | 描述 |
---|---|
200 | 成功 |
201 | 已创建 |
202 | 已接受 |
204 | 无内容 |
301 | 永久移动 |
302 | 临时移动 |
304 | 未修改 |
400 | 错误请求 |
401 | 未授权 |
403 | 禁止 |
404 | 未找到 |
500 | 服务器内部错误 |
501 | 尚未实施 |
502 | 错误网关 |
503 | 服务不可用 |
结论
掌握网络编程的基础知识和常见的HTTP通信过程,能够帮助我们开发出高效的移动应用程序。在iOS开发中,推荐使用NSURLSession
或第三方框架如AFNetworking
进行网络通信,以提高开发效率和用户体验。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!