一、IP 地址(主机名):php
网络中设备的惟一标示。不易记忆,能够用主机名(域名)。html
1) IP V4:前端
2) 本地回环地址:ios
每台机器都有本身的本地回环地址,ip 为 127.0.0.1 ,主机名为 localhost。若是 127.0.0.1 ping 不通,则网卡不正常。git
本地 hosts 文件修改,终端:程序员
$ cd /etc
$ sudo vim hosts
$ 输入密码进入 hosts 文件编辑界面
$ 将光标移动到指定位置
- 英文输入模式下按 i 键进入编辑状态,
- 英文输入模式下按 esc 键进入命令状态,
- 在命令状态下输入 :wq 回车,保存退出 hosts 文件。
二、端口号:github
有效端口为 0 ~ 65535,其中 0 ~ 1024 由系统使用或者保留端口,开发中不要使用 1024 如下的端口。web
1) Netcat 的使用:算法
$ nc -lk 12345
,开启监听,终端将始终监听本地计算机 12345 端口的数据。三、传输协议(通信的规则):数据库
1) TCP:传输控制协议:
2) UDP:用户数据报协议:
3) 常见网络协议:
应用层协议 | 端口 | 说明
-----------------|----------------|---------------------------------
HTTP | 80 | 超文本传输协议
HTTPS | 443 | HTTP+SSL,HTTP 的安全版
FTP | 20, 21, 990 | 文件传输
POP3 | 110 | 邮局协议
SMTP | 25 | 简单邮件传输协议
telnet | 23 | 远程终端协议
ISO 参考模型 | TCP/IP 参考 | 说明 |
---|---|---|
应用层 | 应用层 | FTP,HTTP,TELNET,SMTP,DNS 等协议 |
表示层 | ||
会话层 | ||
传输层 | 传输层 | Socket 开发,TCP 协议,UDP 协议 |
网络层 | 网络互连层 | 路由器,IP 协议,ICMP 协议,ARP 协议,RARP 协议和 BOOTP 协议 |
数据链路层 | 网络接口层 | 交换机 |
物理层 | 网线 |
HTTP 通讯机制是在一次完整的 HTTP 通讯过程当中,Web 浏览器与 Web 服务器之间将完成下列 7 个步骤:
一、创建 TCP 链接
二、Web 浏览器向 Web 服务器发送请求命令
三、Web 浏览器发送请求头信息
四、Web 服务器应答
五、Web 服务器发送应答头信息
六、Web 服务器向浏览器发送数据
七、Web 服务器关闭 TCP 链接
当浏览器向 Web 服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,HTTP 请求信息由 3 部分组成:
请求体
如:
GET /videos.jsp HTTP/1.1 // 请求行 Host: localhost // 请求头 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:36.0) Gecko/20100101 Firefox/36.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,* / *;q=0.8 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7 Connection: keep-alive username=jinqiao&password=1234 // 请求体
一、请求行:
请求的第一行,其组成为:请求方法 请求路径 协议/版本
请求行 :GET /videos.jsp HTTP/1.1
协议/版本:HTTP/1.1
(1) 请求方法:
根据 HTTP 标准,HTTP 请求可使用多种请求方法。例如:HTTP1.1 支持 7 种请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE 和 TARCE。在 Internet 应用中,最经常使用的方法是 GET 和 POST。
GET 方法:
GET 方法是默认的 HTTP 请求方法,经过请求 URL 获得资源。咱们平常用 GET 方法来提交表单数据,然而用 GET 方法提交的表单数据只通过了简单的编码,同时它将做为 URL 的一部分向 Web 服务器发送,所以,若是使用 GET 方法来提交表单数据就存在着安全隐患上。例如:
Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB
从上面的 URL 请求中,很容易就能够辩认出表单提交的内容。(?以后的内容)另外因为 GET 方法提交的数据是做为 URL 请求的一部分因此提交的数据量不能太大。
POST 方法:
POST 方法是 GET 方法的一个替代方法,用于添加新的内容。它主要是向 Web 服务器提交表单数据,尤为是大批量的数据。POST 方法克服了 GET 方法的一些缺点。经过 POST 方法提交表单数据时,数据不是做为 URL 请求的一部分而是做为标准数据传送给 Web 服务器,这就克服了 GET 方法中的信息没法保密和数据量过小的缺点。所以,出于安全的考虑以及对用户隐私的尊重,一般表单提交时采用 POST 方法。
从编程的角度来说,若是用户经过 GET 方法提交数据,则数据存放在 QUERY_STRING 环境变量中,而 POST 方法提交的数据则能够从标准输入流中获取。
HEAD:相似于 GET, 只返回响应,不返回实体数据,用于检查对象是否存在,以及获得对象的元数据,下载数据前使用
apache2 中,可以使用 Limit,LimitExcept 进行访问控制的方法包括:GET, POST, PUT, DELETE, CONNECT,OPTIONS, PATCH, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE,LOCK, 和 UNLOCK。其中, HEAD GET POST OPTIONS PROPFIND 是和读取相关的方法,MKCOL PUT DELETE LOCK UNLOCK COPY MOVE PROPPATCH 是和修改相关的方法。
(2) 请求路径:
(3) 协议/版本:
二、请求头:
请求头包含许多有关客户端环境和请求体的有用信息。例如,请求头能够声明浏览器所用的语言,请求体的长度等。当咱们打开一个网页时,浏览器要向网站服务器发送一个 HTTP 请求头,而后网站服务器根据 HTTP 请求头的内容生成当次请求的内容发送给浏览器。
Host: localhost // 请求主机 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:36.0) Gecko/20100101 Firefox/36.0 // 告诉服务器客户端的类型 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 // 告诉服务器客户端支持的格式 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 // 告诉服务器客户端的语言 Accept-Encoding: gzip, deflate // 告诉服务器客户端支持的压缩格式 Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7 // 告诉服务器客户端字符编码 Connection: keep-alive // 告诉服务器链接类型 Content-Length: 4817 // 提交给服务器的内容长度 Content-Type: text/html // 提交给服务器的内容类型 Authorization: authorString // 访问服务器的验证信息 Range: bytes=0-499 // 指定要返回的数据范围
(1) Host
表示请求的服务器网址。请求报头域主要用于指定被请求资源的 Internet 主机和端口号,它一般从 HTTP URL 中提取出来的。
例如: 咱们在浏览器中输入:http://www.guet.edu.cn/index.html
,浏览器发送的请求消息中,就会包含 Host 请求报头域,以下:Host:http://www.guet.edu.cn
,此处使用缺省端口号 80,若指定了端口号,则变成:Host:指定端口号
。
(2) User-Agent
告诉 HTTP 服务器,客户端使用的操做系统和浏览器的名称和版本。
User-Agent(用户代理),简称 UA,它是一个特殊字符串头,使得服务器可以识别客户端使用的操做系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
例如:User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)
(3) Accept
告诉服务器浏览器端能够接受的媒体类型。
客户端支持的 MIME 类型分别是 text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8,优先顺序是它们从左到右的排列顺序。
text/html,application/xhtml+xml,application/xml 都是 MIME 类型,也能够称为媒体类型和内容类型,斜杠前面的是 type(类型),斜杠后面的是 subtype(子类型);type 指定大的范围,subtype 是 type 中范围更明确的类型,即大类中的小类。
text/html :表示 html 文档;
application/xml :表示 xml 文档。
(4) Accept-Language
告诉服务器浏览器申明本身接收的语言。
语言跟字符集的区别:中文是语言,中文有多种字符集,好比 big5,gb2312,gbk 等等;
例如:Accept-Language: en-us
zh :表示中文
(5) Accept-Encoding
浏览器申明本身接收的编码方法,一般指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是只字符编码);
例如:Accept-Encoding: gzip, deflate
deflate :是同时使用了 LZ77 算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法
(6) Accept-Charset
浏览器申明本身接收的字符集,这就是本文前面介绍的各类字符集和字符编码,如 gb2312,utf-8(一般咱们说Charset包括了相应的字符编码方案);
* :表示任意字符编码,虽然 q 都是等于 0.7,但明确指定的 GB2312,utf-8 比 * 具备更高的优先级
(7) Connection
告诉服务器链接类型。
Connection:Keep-Alive :表示持久链接,长链接。当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 链接不会关闭,若是客户端再次访问这个服务器上的网页,会继续使用这一条已经创建的链接。
Connection:close :表明一个 Request 完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 链接会关闭,当客户端再次发送 Request,须要从新创建 TCP 链接。
长链接:连上服务器就不断开。双方传递数据,不须要再次创建链接。
短链接:连上服务器,获取完数据,就当即断开。HTTP 访问,都是短链接,使用状况很是多。
(8) Content-Length
发送给HTTP服务器数据的长度。
例如: Content-Length:38
(9) Content-Type
提交给服务器的内容类型
例如:Content-Type: application/x-www-form-urlencoded
(10) Authorization
(11) Range
指定要返回的数据范围
- :用于分隔,前面的数字表示起始字节数,后面的数组表示截止字节数,没有表示到末尾。
, :用于分组,能够一次指定多个 Range,不过不多用。
(12) Referer
提供了 Request 的上下文信息的服务器,告诉服务器我是从哪一个连接过来的,好比从我主页上连接到一个朋友那里,他的服务器就可以从 HTTP Referer中统计出天天有多少用户点击我主页上的连接访问他的网站。
例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT
(13) Pragma
防止页面被缓存,在 HTTP/1.1 版本中,它和 Cache-Control:no-cache 做用如出一辙,Pargma 只有一个用法,
例如:Pragma:no-cache
(14) Cookie
三、请求体:
请求头和请求体之间是一个空行,这个行很是重要,它表示请求头已经结束,接下来的是请求体。请求体中能够包含客户提交的查询字符串信息。如:
username=jinqiao&password=1234
在以上的例子的 HTTP 请求中,请求的正文只有一行内容。固然,在实际应用中,HTTP 请求体能够包含更多的内容。
HTTP 应答与 HTTP 请求类似,HTTP 响应也由 3 个部分构成,分别是:
响应正文
如:
HTTP/1.1 200 OK // 状态行 Date: Wed, 29 Jun 2016 10:31:34 GMT // 响应头 Server: Apache/2.4.18 (Unix) Content-Location: index.html.en Content-Length: 4817 Content-Type: text/html Keep-Alive: timeout=5, max=100 <html> // 响应正文 <body> <h1>It works!</h1> </body> </html>
一、状态行:
HTTP 响应的第一行相似于 HTTP 请求的第一行,其组成为:协议/版本 状态码 状态码描述
状态行 :HTTP/1.1 200 OK
状态码 :200 OK
(1) 协议/版本:
(2) 状态码:
HTTP 应答码也称为状态码,它反映了 Web 服务器处理 HTTP 请求状态。HTTP 应答码由 3 位数字构成,其中首位数字定义了应答码的类型:
(3) 状态码描述:
用来解析状态码的状态。
二、响应头:
响应头也和请求头同样包含许多有用的信息,例如服务器类型、日期时间、内容类型和长度等:
Date: Wed, 29 Jun 2016 10:31:34 GMT // 访问日期 Server: Apache/2.4.18 (Unix) // 访问服务器的类型 Content-Location: index.html.en // 访问的文件名 Content-Length: 4817 // 访问文件的大小 Content-Type: text/html // 访问文件的类型 Keep-Alive: timeout=5, max=100 // 链接类型
(1) Cache-Control
这个是很是重要的规则。这个用来指定 Response-Request 遵循的缓存机制。各个指令含义以下
Cache-Control:Public
能够被任何缓存所缓存Cache-Control:Private
内容只缓存到私有缓存中Cache-Control:no-cache
全部内容都不会被缓存(2) Content-Type
WEB 服务器告诉浏览器本身响应的对象的类型和字符集。
Content-Type:text/html; charset=utf-8
Content-Type:text/html;charset=GB2312
Content-Type:image/jpeg
(3) Expires
Expires:Tue, 08 Feb 2022 11:35:14 GMT
(4) Last-Modified
Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT
(5) Server
Server:Microsoft-IIS/7.5
(6) X-AspNet-Version
X-AspNet-Version: 4.0.30319
(7) X-Powered-By
X-Powered-By: ASP.NET
(8) Connection
Connection:keep-alive
当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 链接不会关闭,若是客户端再次访问这个服务器上的网页,会继续使用这一条已经创建的链接。Connection:close
表明一个 Request 完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 链接会关闭,当客户端再次发送 Request,须要从新创建 TCP 链接。(9) Content-Length
Content-Length: 19847
(10) Date
Date: Sat, 11 Feb 2012 11:35:14 GMT
三、响应正文:
响应正文就是服务器返回的 HTML 页面,响应头和正文之间也必须用空行分隔。
<html> <body> <h1>It works!</h1> </body> </html>
Web 应用最多见的用途之一是电子商务,能够利用 Web 服务器端程序令人们可以网络购物,须要指出一点是,缺省状况下,经过 Internet 发送信息是不安全的,若是某人碰巧截获了你发给朋友的一则消息,他就能打开它,假想在里面有你的信用卡号码,这会有多么糟糕,幸运的是,不少 Web 服务器以及 Web 浏览器都有创立安全链接的能力,这样它们就能够安全的通讯了。
经过 Internet 提供安全链接最多见的标准是安全套接层(Secure Sockets layer,SSl)协议。SSL 协议是一个应用层协议(和 HTTP 同样),用于安全方式在 Web 上交换数据,SSL 使用公开密钥编码系统。从本质讲,这意味着业务中每一方都拥有一个公开的和一个私有的密钥。当一方使用另外一方公开密钥进行编码时,只有拥有匹配密钥的人才能对其解码。简单来说,公开密钥编码提供了一种用于在两方之间交换数据的安全方法,SSL 链接创建以后,客户和服务器都交换公开密钥,并在进行业务联系以前进行验证,一旦双方的密钥都经过验证,就能够安全地交换数据。
基于 http 协议的 "文件" 服务器,实现文件的上传/下载/修改/删除。
WebDav 权限,受权信息的格式 BASIC (用户名:口令)base64
安全性并不高,密码很容易被拦截和破解。
应用场景:开发企业级的管理系统,能够用 WebDav 搭建一个内部的文件管理服务器,只是在公司内网使用。
GET 查
PUT/DELETE 都须要设置权限验证,新增(修改)/删除 服务器的内容,须要权限验证。
请求状态码:
status code: 204 修改
status code: 401 身份验证失败
status code: 404 文件不存在
status code: 401 身份验证失败
对于移动客户端来讲,网络的重要性不言而喻。常见的网络请求有同步 GET,同步 POST,异步 GET,异步 POST。
同步和异步网络请求的区别:
一、同步网络请求,主线程负责数据的、视图的初始化和界面的展现等。同步网络数据请求也在主线程中进行,若是耗时较长,在数据请求完毕以前,其余线程一概不响应,会对主线程形成阻塞,形成程序假死现象,用 户体验极差。
二、异步网络请求,主线程负责数据的、视图的初始化和界面的展现等。异步网络数据请求的时候,会在主线程以外单独开辟一个线程去处理网络请求,主线程依然处于可交互状态,程序运行流畅。
许多开发者都会认为同步的链接将会堵塞主线程,其实这种观点是错误的。一个同步的链接是会阻塞调用它的线程。若是你在主线程中建立一个同步链接,没错,主线程会阻塞。可是若是你并非从主线程开启的一个同步的链接,它将会相似异步的链接同样。所以这种状况并不会堵塞你的主线程。事实上,同步和异步的主要区别就是运行 runtime 为会异步链接建立一个线程,而同步链接则不会。
使用 iOS 的网络接口(NSURLSession/NSURLConnection)开发时,上传和下载操做通常都是一条线程异步执行的。可是代理回调有多是多个线程。
GET 请求和 POST 请求的区别:
GET 请求:
POST 请求:
一、url:NSURL
要访问的资源路径。
+ (nullable instancetype)URLWithString:(NSString *)URLString; + (nullable instancetype)URLWithString:(NSString *)URLString relativeToURL:(nullable NSURL *)baseURL;
1) URL 结构:
// 带方括号 [] 的为可选项 scheme://host[:port]/path/[;parameters][?query]#fragment
property | url | description |
---|---|---|
URL | https://swiftinaction.com/example?section=5&ie=utf-8 | URL 路径 |
scheme | https | 协议,http、https、ftp、file(本地文件)、data(数据) |
host | swiftinaction.com | 主机,能够利用 Reachability 框架判断可否链接到要访问的主机 |
port | nil | 端口,nil 使用默认端口 80 |
path | example | 路径,不包含协议头/主机地址/端口/参数 |
parameters | nil | 参数,变量名和变量值成对出现,使用 = 分隔,多个参数使用 & 链接 |
query | section=5&ie=utf-8 | 查询参数 |
fragment | nil | 信息片断 |
absoluteString | https://swiftinaction.com/example?section=5&ie=utf-8 | 完整的字符串 |
resourceSpecifier | //swiftinaction.com/example?section=5&ie=utf-8 | 不包含协议头的剩余内容 |
baseURL | nil | 参照路径,默认为 nil |
2) URL 特殊字符处理:
在一个 URL 中,全部的字符都必须是 ASCII 码,不能包含特殊符号,好比 空格、中文等,若是有特殊符号须要使用百分号转义。
1> 百分号转义编码规则:
字符 | 做用 | 十六进制值 |
---|---|---|
/ | 分隔目录和子目录 | %2F |
? | 分隔 URL 和查询参数 | %3F |
& | 分隔参数 | %26 |
# | 指定书签 | %23 |
% | 指定特殊字符 | %25 |
" | %22 | |
\ | %5C | |
` | 转义 ` | %60 |
| |
转义 | |
%7C |
{ | 转义 { | %7B |
} | 转义 } | %7D |
[ | 转义 [ | %5B |
] | 转义 ] | %5D |
< | 转义 < | %3C |
> | 转义 > | %3E |
^ | 转义 中文字符 | |
_ | 转义 空格 | %20 |
2> 百分号转义 编码:
stringByAddingPercentEscapesUsingEncoding 只对 ` # % ^ { } [ ] | " < > 加 空格 共 14 个字符编码,不包括 & ? 等符号,iOS9 中此方法被淘汰,建议用 stringByAddingPercentEncodingWithAllowedCharacters 方法,此方法中 Characters 的建立方式以下:
编码方式:
// 转义的字符包含 ”#%/<>?@\^`{|} NSCharacterSet *allowedCharacters = [NSCharacterSet URLHostAllowedCharacterSet]; // 转义的字符包含 "#%;<>?[\]^`{|} NSCharacterSet *allowedCharacters = [NSCharacterSet URLPathAllowedCharacterSet]; // 转义的字符包含 "#%<>[\]^`{|} NSCharacterSet *allowedCharacters = [NSCharacterSet URLQueryAllowedCharacterSet]; // 转义的字符包含 "#%<>[\]^`{|} NSCharacterSet *allowedCharacters = [NSCharacterSet URLFragmentAllowedCharacterSet]; // 转义的字符包含 "#%/:<>?@[\]^`{|} NSCharacterSet *allowedCharacters = [NSCharacterSet URLPasswordAllowedCharacterSet]; // 转义的字符包含 "#%/:<>?@[\]^` NSCharacterSet *allowedCharacters = [NSCharacterSet URLUserAllowedCharacterSet]; // 自定义方式 NSCharacterSet *customAllowedSet = [NSCharacterSet characterSetWithCharactersInString:@"`#%^{}\"[]|\\<> "].invertedSet;
使用:
对整个 URL 进行转义:
NSString *urlStr = @"http://192.168.88.200/测试/demo.json"; NSString *newUrlStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"^"].invertedSet]; NSURL *url = [NSURL URLWithString:newUrlStr];
对部分 URL 进行转义:
NSString *urlStr = [@"测试/demo.json" stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"^"].invertedSet]; NSString *newUrlStr = [@"http://192.168.88.200" stringByAppendingPathComponent:urlStr]; NSURL *url = [NSURL URLWithString:newUrlStr];
3> 百分号转义 解码:
二、request:NSURLRequest
要发送给服务器的请求。
+ (instancetype)requestWithURL:(NSURL *)URL; + (instancetype)requestWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval;
1) 参数:
1> URL:要访问的资源路径
2> cachePolicy:缓存策略
// 默认的缓存策略,会在本地缓存 NSURLRequestUseProtocolCachePolicy = 0, // 忽略本地缓存数据,永远都是从服务器获取数据,不使用缓存 NSURLRequestReloadIgnoringLocalCacheData = 1, // 应用场景:股票,彩票 NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData // 首先使用缓存,若是没有本地缓存,才从原地址下载 NSURLRequestReturnCacheDataElseLoad = 2, // 使用本地缓存,从不下载,若是本地没有缓存,则请求失败和 "离线" 数据访问有关,能够和 Reachability 框架结合使用, // 若是用户联网,直接使用默认策略。若是没有联网,可使用返回缓存策略郑重提示:要把用户拉到网络上来。 NSURLRequestReturnCacheDataDontLoad = 3, // 无视任何缓存策略,不管是本地的仍是远程的,老是从原地址从新下载 NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // Unimplemented // 若是本地缓存是有效的则不下载,其余任何状况都从原地址从新下载 NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented 缓存的数据保存在沙盒路径下 Caches 文件夹中的 SQLite 数据库中。
3> timeoutInterval:访问超时时长
建议时长:15~30s,不要设置的过短.
AFNetWorking: 60s
2) NSURLRequest (NSHTTPURLRequest):
1> HTTPMethod:请求方法
2> HTTPBody:请求体
3> HTTPShouldHandleCookies:是否须要处理 Cookies
4> allHTTPHeaderFields:全部 HTTP 请求头字典
3) 请求行:
4) 请求头:
5) 请求体:
三、response:NSURLResponse
从服务器返回的响应。
void (^)(NSURLResponse* __nullable response, NSData* __nullable data, NSError* __nullable connectionError)
1) 参数:
1> response:服务器返回的响应
2> data
3> onnectionError
2) NSURLResponse/NSHTTPURLResponse:
1> statusCode:服务器返回的状态码
1XX 消息,2XX 成功,3XX 扩展属性,4XX 客户端错误,5XX 服务器错误
200 成功
2> URL:服务器返回的 URL
3> MIMEType:数据类型
4> expectedContentLength:预期的数据长度
5> suggestedFilename:建议的文件名
6> textEncodingName:文本的编码名称
若是没有特殊指定,统一使用 UTF8。
字符编码:
3) 状态行:
4) 响应头:
5) 响应体:
四、请求结果处理:
1) 服务器返回给客户端的数据样式:
2) 序列化/反序列化:
3) 错误处理标准代码:
// 有的时候,没有错误,可是也获取不到数据 if (error != nil || data == nil) { // 不要告诉用户太准确的错误信息 NSLog(@"您的网络不给力,请稍候再试 !"); return; } NSLog(@"网络请求成功 %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
iOS9 引入了新特性 App Transport Security (ATS),新特性要求 App 内访问的网络必须使用 HTTPS 协议。iOS9 把全部的 http 请求都改成 https,系统发送的网络请求将统一使用 TLS 1.2 SSL。采用 TLS 1.2 协议,目的是强制加强数据访问安全,并且系统 Foundation 框架下的相关网络请求,将再也不默认使用 Http 等不安全的网络协议,而默认采用 TLS 1.2。服务器所以须要更新,以解析相关数据。如不更新,可经过在 Info.plist 中声明,倒退回不安全的网络请求。
一、关闭强制 https 请求:
设置以下,添加 App Transport Security Settings 项,在其下添加 Allows Arbitrary Loads 并设置值为 YES。
设置代码以下:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
二、设置 http 请求例外:
设置以下,NSIncludeSubdomains 顾名思义是包括子域的意思。
设置代码以下:
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>qq.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> </dict> <key>sina.com.cn</key> <dict> <key>NSIncludesSubdomains</key> <true/> </dict> </dict> </dict>
一、URL 编码表单数据
Content-Type: application/x-www-form-urlencoded
主要向服务器提交与用户隐私相关的信息。好比用户登陆。
1) 特色:
这种方式访问服务器,只须要指定访问方法和数据体便可。 Content-Type 和 Content-Length 会自动完成。Content-Type 是客户端告诉服务器发送数据的类型。Content-Length 发送的数据长度。
2) 实现代码:
request.HTTPMethod = @"POST"; request.HTTPBody = [bodyString dataUsingEncoding:NSUTF8StringEncoding]; 在 firebug 中,能够经过 POST -> 源代码,将发送的 httpbody 的内容粘贴出来。
二、二进制数据 编码表单数据
Content-Type: multipart/form-data
向服务器上传文件,可以上传文件的大小受服务器限制,PHP 限制是 2M。
1) 实现代码:
request.HTTPMethod = @"POST"; request.HTTPBody = 使用规定的格式拼接 // 设置请求头格式,如:Content-Type: multipart/form-data; boundary=%@ Content-Type: multipart/form-data; boundary(分隔线)=(能够随便写,ASCII,字母和数字) // 设置文件类型格式,8 进制流,若是不想告诉服务器具体的文件类型,可使用这个 Content-Type: application/octet-stream
2) 文件上传参数设置:
Content-Type:客户端告诉服务器上传文件的文件类型。
文件类型:
image/jpeg | 图片文件 |
---|---|
image/png | 图片文件 |
image/gif | 图片文件 |
audio/mpeg | mp3 文件 |
video/mp4 | mp4 文件 |
text/html | html 文本文件 |
text/plain | txt 文本文件 |
text/rtf | rtf 文本文件 |
application/pdf | pdf 文件 |
application/json | json 文件 |
application/octet-stream | 8 进制流,若是不想告诉服务器具体的文件类型,可使用这个 |
name (text) :后台规定的文本内容字段名,是负责上传文件的脚本中的字段名
3) 文件上传数据封装:
有些服务器能够在上传文件的同时,提交一些文本内容给服务器。典型应用:新浪微博,上传图片的同时,发送一个微博。
如下部分,是发送给服务器的二进制数据的组成格式,若是在 iOS 中,要实现 POST 上传文件,须要按照如下格式拼接数据。格式是 W3C 指定的标准格式,苹果没有作任何封装。
1> 上传单个文件
#define boundary @"uploadBoundary" // 设置请求头 Content-Type: multipart/form-data; boundary=boundary // 上传的文件数据封装 --- 二进制数据格式 --boundary\r\n Content-Disposition: form-data; name="userfile"; filename="文件1.txt"\r\n // 设置文件名 Content-Type: application/octet-stream\r\n // 设置文件类型 \r\n 待上传文件的二进制数据 \r\n --boundary\r\n Content-Disposition: form-data; name="usertext"\r\n // 设置文本字段名 \r\n 待上传文本内容二进制数据 \r\n --boundary-- \r\n
2> 上传多个文件
#define boundary @"uploadBoundary" // 设置请求头 Content-Type: multipart/form-data; boundary=boundary // 上传的文件数据封装 --- 二进制数据格式 --boundary\r\n Content-Disposition: form-data; name="userfile[]"; filename="文件1.txt"\r\n // 设置文件名,第一个上传的文件 Content-Type: application/octet-stream\r\n // 设置文件类型 \r\n 待上传文件的二进制数据 \r\n --boundary\r\n Content-Disposition: form-data; name="userfile[]"; filename="文件2.txt"\r\n // 设置文件名,第二个上传的文件 Content-Type: application/octet-stream\r\n // 设置文件类型 \r\n 待上传文件的二进制数据 \r\n --boundary\r\n Content-Disposition: form-data; name="usertext"\r\n // 设置文本字段名 \r\n 待上传文本内容二进制数据 \r\n --boundary-- // 结束分割线标记 \r\n
4) 关于第三方框架:
5) 为何要同时上传多个文件:
三、RESTful 设计风格
主要用在后端开发的,前端程序员只要知道便可。
1) 最直观的特色:
2) 主要的表现形式:
使用一个 URL,使用不一样的 HTTP 访问方法,表达不一样的语义。
示例:http://www.xxx.com/product/123
DELETE http://www.xxx.com/product/123 语义:在服务器 "删除" 产品代号是123 的产品记录
POST 提交二进制数据,须要提交一个 JSON 格式的二进制数据,后端程序员,能够直接反序列化,获得 JSON 中的字典信息。
分别对应:增,删,改,查
3) POST 数据编码类型:
1> Content-Type: application/json
向服务器发送 JSON 数据。
[p dictionaryWithValuesForKeys:@[@"username", @"age", @"title", @"height"]]; 模型转字典,传入的数组是须要序列化的属性 [NSJSONSerialization isValidJSONObject:obj]; 判断给定的对象可以被序列化 [NSJSONSerialization dataWithJSONObject:obj options:0 error:NULL]; 序列化
2> Content-Type: text/xml
向服务器发送 XML 数据。
iOS 开发极少用,若是开发中碰到可使用 GData 框架。
一、HEAD 方法:
HEAD 方法一般是用来在下载文件以前,获取远程服务器上的文件信息。与 GET 方法相比,一样可以拿到响应头,可是不返回数据实体,用户能够根据响应头信息,肯定下一步操做。
用响应头的 response.expectedContentLength 能够获取文件数据的大小。
同步方法是阻塞式的,一般只有 HEAD 方法(得到的数据不多,并且后续的下载会依赖)才会使用同步方法。在截取网络数据的时候,最好使用同步方法,并且若是频率过高,须要增长延时,不然会被服务器给加入黑名单。
二、文件下载方法:
1) 使用 GET 数据请求方法,数据请求完成后,将数据手动写入文件中。
2) 使用专门用于下载的 GET 方法,数据请求完成后,将会自动写入指定文件中。
三、文件本地保存方法:
四、文件断点下载步骤:
3) 根据本地文件的长度,从对应 "偏移" 位置开始下载:
bytes=-x 从 文件开始下载,下载 x 字节
如:[urlRequest setValue:[NSString stringWithFormat:@"bytes=%lld-", offset] forHTTPHeaderField:@"Range"];
五、文件下载设置:
1) NSURLConnection:
代理方法默认都是在主线程上执行的,会对界面产生卡顿。
为了让链接工做正常,调用线程的运行循环必须在默认的运行循环模式下。
若是要让 NSURLConnection 实如今后台线程回调代理方法,须要在后台线程启动 NSURLConnection,并启动后台线程的运行循环,NSURLConnection 执行完毕后,会自动中止后台线程的运行循环。
2) NSURLSession:
若是显示比较大的图片,NSURLSession 能够利用磁盘缓存直接下载到本地,不会形成内存占用太大。
下载任务的特色可让程序员只关心解压缩的工做。
3) 启动子线程的运行循环方法:
CFRunLoopRun(); // NSRunLoop 只能启动,没有提供中止的接口 [[NSRunLoop currentRunLoop] run];
六、块代码回调:
1) Block 的属性定义:
2) 网络 block 回调的几个 "约定":
AFN/SDWebImage 等第三方框架,都是这么作的。
3> 失败的回调,能够在主线程,也能够在后台线程
Objective-C
NSURLConnection 同步请求
// 设置网络接口 NSURL *url1 = [NSURL URLWithString:@"http://192.168.88.200:8080/MJServer/video?type=JSON"]; // 建立同步网络请求 NSData *syncNetData1 = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:url1] returningResponse:nil error:NULL];
NSData 同步请求
// 设置网络接口 NSURL *url2 = [NSURL URLWithString:@"http://192.168.88.200:8080/MJServer/video?type=JSON"]; // 建立同步网络请求 NSData *syncNetData2 = [NSData dataWithContentsOfURL:url2];
NSString 同步请求
// 设置网络接口 NSURL *url3 = [NSURL URLWithString:@"http://192.168.88.200:8080/MJServer/video?type=JSON"]; // 建立同步网络请求 NSString *syncNetString = [NSString stringWithContentsOfURL:url3 encoding:NSUTF8StringEncoding error:nil];
WebView 同步请求
// 设置网络接口 NSURL *url4 = [NSURL URLWithString:@"http://192.168.88.200:8080/MJServer"]; // 建立同步网络请求 [self.webView loadRequest:[NSURLRequest requestWithURL:url4]];
Swift
NSURLConnection 同步请求
// 设置网络接口 let url1 = NSURL(string: "http://192.168.88.200:8080/MJServer/video?type=JSON") // 建立同步网络请求 let syncNetData1 = try! NSURLConnection.sendSynchronousRequest(NSURLRequest(URL: url1!), returningResponse: nil)
NSData 同步请求
// 设置网络接口 let url2 = NSURL(string: "http://192.168.88.200:8080/MJServer/video?type=JSON") // 建立同步网络请求 let syncNetData2 = NSData(contentsOfURL: url2!)
NSString 同步请求
// 设置网络接口 let url3 = NSURL(string: "http://192.168.88.200:8080/MJServer/video?type=JSON") // 建立同步网络请求 let syncNetString = try! NSString(contentsOfURL: url3!, encoding: NSUTF8StringEncoding)
WebView 同步请求
// 设置网络接口 let url4 = NSURL(string: "http://192.168.88.200:8080/MJServer") // 建立同步网络请求 self.webView.loadRequest(NSURLRequest(URL: url4!))
Objective-C
// 设置网络接口 NSURL *url = [NSURL URLWithString:@"http://192.168.88.200:8080/MJServer/video"]; // 建立请求 NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url]; // 设置请求体(请求参数) urlRequest.HTTPBody = [@"type=JSON" dataUsingEncoding:NSUTF8StringEncoding]; // 设置请求方式 urlRequest.HTTPMethod = @"POST"; // 建立同步连接 NSData *syncNetData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:nil];
Swift
// 设置网络接口 let url = NSURL(string: "http://192.168.88.200:8080/MJServer/video") // 建立请求 let urlRequest = NSMutableURLRequest(URL: url!) // 设置请求体(请求参数) urlRequest.HTTPBody = "type=JSON".dataUsingEncoding(NSUTF8StringEncoding) // 设置请求方式 urlRequest.HTTPMethod = "POST" // 建立同步连接 let syncNetData = try? NSURLConnection.sendSynchronousRequest(urlRequest, returningResponse: nil)
Objective-C
// 设置网络接口 NSURL *url = [NSURL URLWithString:@"http://192.168.88.200:8080/MJServer/video?type=XML"]; // 建立异步网络请求 [NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:url] queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { }];
Swift
// 设置网络接口 let url = NSURL(string: "http://192.168.88.200:8080/MJServer/video?type=XML") // 建立异步网络请求 NSURLConnection.sendAsynchronousRequest(NSURLRequest(URL: url!), queue: NSOperationQueue.mainQueue()) { (response:NSURLResponse?, data:NSData?, connectionError:NSError?) in }
Objective-C
// 设置网络接口 NSURL *url = [NSURL URLWithString:@"http://192.168.88.200:8080/MJServer/video"]; // 建立请求 NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url]; // 设置请求体(请求参数) urlRequest.HTTPBody = [@"type=XML" dataUsingEncoding:NSUTF8StringEncoding]; // 设置请求方式 urlRequest.HTTPMethod = @"POST"; // 建立异步链接 [NSURLConnection sendAsynchronousRequest:urlRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { }];
Swift
// 设置网络接口 let url = NSURL(string: "http://192.168.88.200:8080/MJServer/video") // 建立请求 let urlRequest = NSMutableURLRequest(URL: url!) // 设置请求体(请求参数) urlRequest.HTTPBody = "type=XML".dataUsingEncoding(NSUTF8StringEncoding) // 设置请求方式 urlRequest.HTTPMethod = "POST" // 建立异步网络请求 NSURLConnection.sendAsynchronousRequest(urlRequest, queue: NSOperationQueue.mainQueue()) { (response:NSURLResponse?, data:NSData?, connectionError:NSError?) in }
Objective-C
// 设置网络接口 NSURL *url = [NSURL URLWithString:@"http://192.168.88.200/demo.json"]; // 建立网络请求 NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:15.0]; // 发送网络链接 [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { /* 网络请求完成,处理请求结果,error != nil || data == nil 请求失败。 */ // 错误处理的标准代码 - 有的时候,没有错误,可是也获取不到数据 if (error != nil || data == nil) { // 不要告诉用户太准确的错误信息 NSLog(@"您的网络不给力,请稍候再试 !"); return; } // 请求数据解析 id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL]; NSLog(@"网络请求成功 %@", result); }] resume];
Objective-C
单文件上传
// 设置网络接口 NSURL *url = [NSURL URLWithString:@"http://192.168.88.200/upload/upload.php"]; // 建立网络请求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.HTTPMethod = @"POST"; // 设置请求头 #define boundary @"uploadBoundary" [request setValue:[NSString stringWithFormat:@"multipart/form-data; charset=utf-8; boundary=%@", boundary] forHTTPHeaderField:@"Content-Type"]; // 设置上传的文件数据 NSMutableData *formDataM = [NSMutableData data]; // 添加文件 [formDataM appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [formDataM appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", @"userfile", @"test.jpg"] dataUsingEncoding:NSUTF8StringEncoding]]; [formDataM appendData:[[NSString stringWithFormat:@"Content-Type: %@\r\n", @"image/jpeg"] dataUsingEncoding:NSUTF8StringEncoding]]; [formDataM appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; // 本地待上传的文件 [formDataM appendData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"HQ_0005" ofType:@"jpg"]]]; [formDataM appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; // 添加文本 [formDataM appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [formDataM appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n%@\r\n", @"username", @"qian"] dataUsingEncoding:NSUTF8StringEncoding]]; // 添加结束分隔符 [formDataM appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [[[NSURLSession sharedSession] uploadTaskWithRequest:request fromData:formDataM completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (error != nil || data == nil) return; id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL]; [self refreshUI:result]; }] resume];
单文件上传简单封装
// NSData+FormData.m 。。。。。 // 设置上传的文件数据 #define boundary @"uploadBoundary" NSMutableData *formDataM = [NSMutableData data]; [formDataM q_setHttpHeaderFieldWithRequest:request fileBoundary:boundary]; // 设置请求头 [formDataM q_appendPartWithFileURL:[NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"HQ_0005" ofType:@"jpg"]] fileBoundary:boundary name:@"userfile" fileName:nil mimeType:nil]; // 添加文件 [formDataM q_appendPartWithText:@"qian" textName:@"username" fileBoundary:boundary]; // 添加文本 [formDataM q_appendPartEndingWithFileBoundary:boundary]; // 添加结束分隔符
单文件上传封装
// NSData+FormData.m 。。。。。 // 设置上传的文件数据 // 指定文件数据方式 NSData *filedata = [[NSData alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"HQ_0003" ofType:@"jpg"]]; NSData *formData = [NSData q_formDataWithRequest:request fileData:filedata name:@"userfile" fileName:@"HQ_0003.jpg" mimeType:@"image/jpeg"]; NSData *formData = [NSData q_formDataWithRequest:request text:@"qian" textName:@"username" fileData:filedata name:@"userfile" fileName:@"HQ_0003.jpg" mimeType:@"image/jpeg"]; // 指定文件路径方式 NSURL *fileURL = [NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"HQ_0005" ofType:@"jpg"]]; NSData *formData = [NSData q_formDataWithRequest:request fileURL:fileURL name:@"userfile" fileName:@"test.jpg" mimeType:@"image/jpeg"]; NSData *formData = [NSData q_formDataWithRequest:request text:@"qian" textName:@"username" fileURL:fileURL name:@"userfile" fileName:@"test.jpg" mimeType:@"image/jpeg"];
多文件上传
// 设置网络接口 NSURL *url = [NSURL URLWithString:@"http://192.168.88.200/upload/upload-m.php"]; // 建立网络请求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.HTTPMethod = @"POST"; // 设置请求头 #define boundary @"uploadBoundary" [request setValue:[NSString stringWithFormat:@"multipart/form-data; charset=utf-8; boundary=%@", boundary] forHTTPHeaderField:@"Content-Type"]; // 设置上传的文件数据 NSMutableData *formDataM = [NSMutableData data]; // 添加第一个文件 [formDataM appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [formDataM appendData:[[NSString stringWithFormat:@"Content-Disposition:form-data; name=\"%@\"; filename=\"%@\"\r\n", @"userfile[]", @"test1.jpg"] dataUsingEncoding:NSUTF8StringEncoding]]; [formDataM appendData:[[NSString stringWithFormat:@"Content-Type: %@\r\n", @"image/jpeg"] dataUsingEncoding:NSUTF8StringEncoding]]; [formDataM appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [formDataM appendData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"HQ_0003" ofType:@"jpg"]]]; [formDataM appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; // 添加第二个文件 [formDataM appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [formDataM appendData:[[NSString stringWithFormat:@"Content-Disposition:form-data; name=\"%@\"; filename=\"%@\"\r\n", @"userfile[]", @"test2.jpg"] dataUsingEncoding:NSUTF8StringEncoding]]; [formDataM appendData:[[NSString stringWithFormat:@"Content-Type: %@\r\n", @"image/jpeg"] dataUsingEncoding:NSUTF8StringEncoding]]; [formDataM appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [formDataM appendData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"HQ_0005" ofType:@"jpg"]]]; [formDataM appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; // 添加文本 [formDataM appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [formDataM appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n%@\r\n", @"username", @"qian"] dataUsingEncoding:NSUTF8StringEncoding]]; // 添加结束分隔符 [formDataM appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [[[NSURLSession sharedSession] uploadTaskWithRequest:request fromData:formDataM completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (error != nil || data == nil) return; id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL]; [self refreshUI:result]; }] resume];
多文件上传封装
// NSData+FormData.m 。。。。。 // 设置上传的文件数据 // 指定文件数据方式 NSData *filedata1 = [[NSData alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"HQ_0003" ofType:@"jpg"]]; NSData *filedata2 = [[NSData alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"HQ_0005" ofType:@"jpg"]]; NSData *formData = [NSData q_formDataWithRequest:request fileDatas:@[filedata1, filedata2] name:@"userfile[]" fileNames:@[@"test1.jpg", @"test2.jpg"] mimeTypes:@[@"image/jpeg", [NSNull null]]]; NSData *formData = [NSData q_formDataWithRequest:request texts:@[@"qian"] textNames:@[@"username"] fileDatas:@[filedata1, filedata2] name:@"userfile[]" fileNames:@[@"test1.jpg", @"test2.jpg"] mimeTypes:@[@"image/jpeg", [NSNull null]]]; // 指定文件路径方式 NSURL *fileURL1 = [NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"HQ_0003" ofType:@"jpg"]]; NSURL *fileURL2 = [NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"HQ_0005" ofType:@"jpg"]]; NSData *formData = [NSData q_formDataWithRequest:request fileURLs:@[fileURL1, fileURL2] name:@"userfile[]" fileNames:@[@"test1.jpg", [NSNull null]] mimeTypes:@[@"image/jpeg", [NSNull null]]]; NSData *formData = [NSData q_formDataWithRequest:request texts:@[@"qian"] textNames:@[@"username"] fileURLs:@[fileURL1, fileURL2] name:@"userfile[]" fileNames:@[@"test1.jpg", [NSNull null]] mimeTypes:@[@"image/jpeg", [NSNull null]]];
Objective-C
获取文件信息
// 设置网络接口 NSURL *url = [NSURL URLWithString:@"http://192.168.88.200/download/file/minion_01.mp4"]; // 建立网络请求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.HTTPMethod = @"HEAD"; [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (error != nil || data == nil) return; NSLog(@"要下载文件的长度 %tu", response.expectedContentLength); }] resume];
基本下载
// 设置请求路径 NSURL *url = [NSURL URLWithString:@"http://192.168.88.200/download/file/minion_01.mp4"]; // 建立请求对象 NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; // 建立会话对象 NSURLSession *urlSession = [NSURLSession sharedSession]; NSURLSessionDownloadTask *urlSessionDownloadTask = [urlSession downloadTaskWithRequest:urlRequest completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (error == nil) { // 设置下载的文件存储路径 NSString *documentsDirPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:response.suggestedFilename]; // 处理下载的数据 [[NSFileManager defaultManager] copyItemAtPath:location.path toPath:documentsDirPath error:nil]; } }]; // 执行任务 [urlSessionDownloadTask resume];
Objective-C
GET 请求
// 设置文件位置 NSURL *url = [NSURL URLWithString:@"http://192.168.88.200/uploads/123.png"]; [[[NSURLSession sharedSession] downloadTaskWithURL:url completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) { // 将下载的文件读取到二进制数据 NSData *data = [NSData dataWithContentsOfURL:location]; dispatch_async(dispatch_get_main_queue(), ^{ // 若是显示比较大的图片,NSURLSession 能够利用 self.iconView.image = [UIImage imageWithData:data]; }); // 磁盘缓存直接下载到本地,不会形成内存占用太大 }] resume];
PUT 请求
// 本地要上传的文件 NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"minion.mp4" withExtension:nil]; // 123.mp4 保存到服务器的文件名 NSURL *url = [NSURL URLWithString:@"http://192.168.88.200/uploads/123.mp4"]; // PUT 文件上传,以文件的方式直接写入到 WebDav 服务器中 NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url]; urlRequest.HTTPMethod = @"PUT"; // 服务器验证,用户访问名和密码 [urlRequest setValue:[@"admin:adminpasswd" q_basic64AuthEncode] forHTTPHeaderField:@"Authorization"]; [[[NSURLSession sharedSession] uploadTaskWithRequest:urlRequest fromFile:fileURL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSLog(@"%@ %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding], response); }] resume];
DELETE 请求
// 要删除的文件完成路径 NSURL *url = [NSURL URLWithString:@"http://192.168.88.200/uploads/123.mp4"]; // DELETE 文件删除 NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url]; urlRequest.HTTPMethod = @"DELETE"; // 服务器验证,用户访问名和密码 [urlRequest setValue:[@"admin:adminpasswd" q_basic64AuthEncode] forHTTPHeaderField:@"Authorization"]; [[[NSURLSession sharedSession] dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSLog(@"%@ %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding], response); }] resume];