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的使用步骤

  1. 创建NSURL对象,设置请求路径。
  2. 使用NSURL创建NSURLRequest对象,设置请求头和请求体。
  3. 使用NSURLConnection发送请求。

3. NSURLConnection发送请求

NSURLConnection常见的发送请求方法有三种:

  1. 同步请求
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error;
  1. 异步请求(使用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进行网络通信,以提高开发效率和用户体验。

posted @   Mr.陳  阅读(1961)  评论(0编辑  收藏  举报
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
点击右上角即可分享
微信分享提示