iOS http网络请求相关知识总结
2015-09-19 09:56
501 查看
iOS http网络请求相关知识总结
网络请求上遇到比较大的问题是multipart/form-data的多表单post上传格式。
iOS 的网络请求解决方案主要有四种,NSURLConnect、NSURLSession、 AFNetWorking、MKNetWorkKit四种。
NSURLConnect是一个比较老的网络请求api,可以兼容iOS2.0之后的系统,但请求方式比较灵活,能具备同步与异步请求。
NSURLSession是基于NSURLConnect基础上,开发的网络请求api,能兼容iOS7.0之后的系统。性能上有了较大的优化,特别是后台传输方面的使用更加便捷。
AFNetWorking是非常轻便的网络请求第三方库,其于NSURLConnect、NSURLSession的基础上再封装一层,使调用网络请求更简单,特别是上传文件的表单上的封装。
MKNetWorkKit也是轻便的网络请求第三方库,其效果与AFNetWorking类似,也比较好用,但与AFNetWorking相比,MKNetWorkKit是单独维护的,从版本升级的角度上考虑,AFNetWorking更加适合应用于长久发展的项目中。
本项目主要采取AFNetWorking为主要的网络解决方案,但部分网络请求依然直接采用NSURLConnect或NSURLSession的方式实现,代码风格的统一工作未完成。
Http请求头
当打开一个网页时,浏览器要向网站服务器发送一个HTTP请求头,然后网站服务器根据HTTP请求头的内容生成当次请求的内容发送给浏览器。
http请求头的简单例子:
Accept-Language: zh-cn,zh;q=0.5
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; 域名)
Host: 域名
Connection: Keep-Alive
http请求头的参数
(1)Accept-Language: zh-cn,zh;q=0.5
意思:浏览器支持的语言分别是中文和简体中文,优先支持简体中文。
详解:
Accept-Language表示浏览器所支持的语言类型;
zh-cn表示简体中文;zh 表示中文;
q是权重系数,范围 0 =< q <= 1,q 值越大,请求越倾向于获得其“;”之前的类型表示的内容,若没有指定 q 值,则默认为1,若被赋值为0,则用于提醒服务器哪些是浏览器不接受的内容类型。
(2)Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
意思:浏览器支持的字符编码分别是 GB2312、utf-8 和任意字符,优先顺序是 GB2312、utf-8、*。
详解:
Accept-Charset告诉 Web 服务器,浏览器可以接受哪些字符编码;
GB2312是中国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,又称GB0,由中国国家标准总局发布,1981年5月1日实施。GB2312 编码通行于中国大陆;新加坡等地也采
用此编码。
utf-8是 Unicode 的一种变长字符编码又称万国码,由 Ken Thompson 于1992年创建,现在已经标准化为 RFC 3629。
*表示任意字符编码,虽然 q 都是等于 0.7,但明确指定的 GB2312,utf-8 比 * 具有更高的优先级。
(3)Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
意思:浏览器支持的 MIME 类型分别是 text/html、application/xhtml+xml、application/xml 和 */*,优先顺序是它们从左到右的排列顺序。
详解:
Accept表示浏览器支持的 MIME 类型;
MIME的英文全称是 Multipurpose Internet Mail Extensions(多功能 Internet 邮件扩充服务),它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。
text/html,application/xhtml+xml,application/xml 都是 MIME 类型,也可以称为媒体类型和内容类型,斜杠前面的是 type(类型),斜杠后面的是 subtype(子类型);type 指定大的范围,subtype 是 type 中范围更明确的类型,即大类中的小类。
Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
text/html表示 html 文档;
Application:用于传输应用程序数据或者二进制数据;(本项目中主要使用的MIME类型)
application/xhtml+xml表示 xhtml 文档;
application/xml表示 xml 文档。
MIMEType参考手册
(4)Accept-Encoding: gzip, deflate
意思:浏览器支持的压缩编码是 gzip 和 deflate。
详解:
Accept-Encoding表示浏览器有能力解码的编码类型;
gzip是 GNU zip 的缩写,它是一个 GNU 自由软件的文件压缩程序,也经常用来表示 gzip 这种文件格式。
deflate是同时使用了 LZ77 算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。
(5)User-Agent: Mozilla/5.0 (compatible;域名)
意思:使用的用户代理是 Mozilla/5.0 (compatible; 域名)。
详解:
User-Agent(用户代理),简称 UA,它是一个特殊字符串头,使得服务器能够识别客户端使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
Mozilla/5.0:Mozilla 是浏览器名,版本是 5.0;
compatible(兼容的)表示平台是兼容模式;
这个参数的设置对于本项目来说比较重要,若user-agnet设置为nil时。就会按照默认的数据推送给请求端,而对于本项目,移动端若没有设置这个参数,则会收到html5页面。
(6)Host: 域名
Host表示请求的服务器网址;
(7)Connection: Keep-Alive
Connection表示客户端与服务连接类型;
Keep-Alive表示持久连接;
(8)content-type
原则上浏览器会根据Content-Type来决定如何显示返回的消息体内容。content-type这个参数的数据类型依然是MIMEType。
content-type有下面的形式:
Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据;
Application:用于传输应用程序数据或者二进制数据;
Message:用于包装一个E-mail消息;
Image:用于传输静态图片数据;
Audio:用于传输音频或者音声数据;
Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。
subtype用于指定type的详细形式。content-type/subtype配对的集合和与此相关的参数,将随着时间而增长。
但对于本项目,返回的数据的显示或者应用,所以更多的是开发者的手动处理。
iOS中http body表单的拼接
由于项目需要上传时同时传输关键参数username、password,以及二进制文件数据,因此需要同时传输多个表单,因此content-type的类型为:multipart/form-data,而对于多表单的实现,iOS中规定必须手动拼接实现,而且拼接出来的表单只要稍微有一点点错误,例如多了一个空格、或者换行数多了一个,都无法上传数据。
表单上传的基本格式:
--Boundary+72D4CD655314C423
//分割符号,其中“—Boundary+”这部分是固定的,而剩余的那串数字无特定要求只要非中文,通过随机数函数生成即可。
Content-Disposition: form-data; name="uploadFile"; filename="001.png” //name参数的类容必须要与服务区一致,否则服务器无法获取文件
Content-Type:image/png //mimetype
Content-Transfer-Encoding: binary //数据编码方式
//这里必须有一行为空
... contents of boris.png … //文件的二进制数据
--Boundary+72D4CD655314C423—
//分割符号,其中若分割符号后带--表示这是混合表单的结束句
参数与图片的多表单实例:
--Boundary+72D4CD655314C423 //表单一
Content-Disposition: form-data; name="username"
[align=left] [/align]
test001
--Boundary+72D4CD655314C423 //表单二
Content-Disposition: form-data; name=“password"
[align=left] [/align]
123
--Boundary+72D4CD655314C423 //表单三
Content-Disposition: form-data; name="uploadFile"; filename=“luozhiwei.png"
Content-Type:image/png
Content-Transfer-Encoding: binary
... contents of boris.png ...
--Boundary+72D4CD655314C423—
//结束符号
网络请求上遇到比较大的问题是multipart/form-data的多表单post上传格式。
iOS 的网络请求解决方案主要有四种,NSURLConnect、NSURLSession、 AFNetWorking、MKNetWorkKit四种。
NSURLConnect是一个比较老的网络请求api,可以兼容iOS2.0之后的系统,但请求方式比较灵活,能具备同步与异步请求。
NSURLSession是基于NSURLConnect基础上,开发的网络请求api,能兼容iOS7.0之后的系统。性能上有了较大的优化,特别是后台传输方面的使用更加便捷。
AFNetWorking是非常轻便的网络请求第三方库,其于NSURLConnect、NSURLSession的基础上再封装一层,使调用网络请求更简单,特别是上传文件的表单上的封装。
MKNetWorkKit也是轻便的网络请求第三方库,其效果与AFNetWorking类似,也比较好用,但与AFNetWorking相比,MKNetWorkKit是单独维护的,从版本升级的角度上考虑,AFNetWorking更加适合应用于长久发展的项目中。
本项目主要采取AFNetWorking为主要的网络解决方案,但部分网络请求依然直接采用NSURLConnect或NSURLSession的方式实现,代码风格的统一工作未完成。
Http请求头
当打开一个网页时,浏览器要向网站服务器发送一个HTTP请求头,然后网站服务器根据HTTP请求头的内容生成当次请求的内容发送给浏览器。
http请求头的简单例子:
Accept-Language: zh-cn,zh;q=0.5
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; 域名)
Host: 域名
Connection: Keep-Alive
http请求头的参数
(1)Accept-Language: zh-cn,zh;q=0.5
意思:浏览器支持的语言分别是中文和简体中文,优先支持简体中文。
详解:
Accept-Language表示浏览器所支持的语言类型;
zh-cn表示简体中文;zh 表示中文;
q是权重系数,范围 0 =< q <= 1,q 值越大,请求越倾向于获得其“;”之前的类型表示的内容,若没有指定 q 值,则默认为1,若被赋值为0,则用于提醒服务器哪些是浏览器不接受的内容类型。
(2)Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
意思:浏览器支持的字符编码分别是 GB2312、utf-8 和任意字符,优先顺序是 GB2312、utf-8、*。
详解:
Accept-Charset告诉 Web 服务器,浏览器可以接受哪些字符编码;
GB2312是中国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,又称GB0,由中国国家标准总局发布,1981年5月1日实施。GB2312 编码通行于中国大陆;新加坡等地也采
用此编码。
utf-8是 Unicode 的一种变长字符编码又称万国码,由 Ken Thompson 于1992年创建,现在已经标准化为 RFC 3629。
*表示任意字符编码,虽然 q 都是等于 0.7,但明确指定的 GB2312,utf-8 比 * 具有更高的优先级。
(3)Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
意思:浏览器支持的 MIME 类型分别是 text/html、application/xhtml+xml、application/xml 和 */*,优先顺序是它们从左到右的排列顺序。
详解:
Accept表示浏览器支持的 MIME 类型;
MIME的英文全称是 Multipurpose Internet Mail Extensions(多功能 Internet 邮件扩充服务),它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。
text/html,application/xhtml+xml,application/xml 都是 MIME 类型,也可以称为媒体类型和内容类型,斜杠前面的是 type(类型),斜杠后面的是 subtype(子类型);type 指定大的范围,subtype 是 type 中范围更明确的类型,即大类中的小类。
Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
text/html表示 html 文档;
Application:用于传输应用程序数据或者二进制数据;(本项目中主要使用的MIME类型)
application/xhtml+xml表示 xhtml 文档;
application/xml表示 xml 文档。
MIMEType参考手册
(4)Accept-Encoding: gzip, deflate
意思:浏览器支持的压缩编码是 gzip 和 deflate。
详解:
Accept-Encoding表示浏览器有能力解码的编码类型;
gzip是 GNU zip 的缩写,它是一个 GNU 自由软件的文件压缩程序,也经常用来表示 gzip 这种文件格式。
deflate是同时使用了 LZ77 算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。
(5)User-Agent: Mozilla/5.0 (compatible;域名)
意思:使用的用户代理是 Mozilla/5.0 (compatible; 域名)。
详解:
User-Agent(用户代理),简称 UA,它是一个特殊字符串头,使得服务器能够识别客户端使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
Mozilla/5.0:Mozilla 是浏览器名,版本是 5.0;
compatible(兼容的)表示平台是兼容模式;
这个参数的设置对于本项目来说比较重要,若user-agnet设置为nil时。就会按照默认的数据推送给请求端,而对于本项目,移动端若没有设置这个参数,则会收到html5页面。
(6)Host: 域名
Host表示请求的服务器网址;
(7)Connection: Keep-Alive
Connection表示客户端与服务连接类型;
Keep-Alive表示持久连接;
(8)content-type
原则上浏览器会根据Content-Type来决定如何显示返回的消息体内容。content-type这个参数的数据类型依然是MIMEType。
content-type有下面的形式:
Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据;
Application:用于传输应用程序数据或者二进制数据;
Message:用于包装一个E-mail消息;
Image:用于传输静态图片数据;
Audio:用于传输音频或者音声数据;
Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。
subtype用于指定type的详细形式。content-type/subtype配对的集合和与此相关的参数,将随着时间而增长。
但对于本项目,返回的数据的显示或者应用,所以更多的是开发者的手动处理。
iOS中http body表单的拼接
由于项目需要上传时同时传输关键参数username、password,以及二进制文件数据,因此需要同时传输多个表单,因此content-type的类型为:multipart/form-data,而对于多表单的实现,iOS中规定必须手动拼接实现,而且拼接出来的表单只要稍微有一点点错误,例如多了一个空格、或者换行数多了一个,都无法上传数据。
表单上传的基本格式:
--Boundary+72D4CD655314C423
//分割符号,其中“—Boundary+”这部分是固定的,而剩余的那串数字无特定要求只要非中文,通过随机数函数生成即可。
Content-Disposition: form-data; name="uploadFile"; filename="001.png” //name参数的类容必须要与服务区一致,否则服务器无法获取文件
Content-Type:image/png //mimetype
Content-Transfer-Encoding: binary //数据编码方式
//这里必须有一行为空
... contents of boris.png … //文件的二进制数据
--Boundary+72D4CD655314C423—
//分割符号,其中若分割符号后带--表示这是混合表单的结束句
参数与图片的多表单实例:
--Boundary+72D4CD655314C423 //表单一
Content-Disposition: form-data; name="username"
[align=left] [/align]
test001
--Boundary+72D4CD655314C423 //表单二
Content-Disposition: form-data; name=“password"
[align=left] [/align]
123
--Boundary+72D4CD655314C423 //表单三
Content-Disposition: form-data; name="uploadFile"; filename=“luozhiwei.png"
Content-Type:image/png
Content-Transfer-Encoding: binary
... contents of boris.png ...
--Boundary+72D4CD655314C423—
//结束符号
相关文章推荐
- 一个简单的TCP套接字编程实例
- 校园网络 120 (数组模拟+技巧)
- 计算机网络之IP协议族
- 计算机网络之IP地址
- 计算机网络之IP地址
- 计算机网络之IP协议族
- BT、电骡、迅雷等P2P下载原理
- Androdi网络连接——WebView、Volley、xutils
- TCP和UDP比较
- Android实现网络多线程断点续传下载
- TCP的拥塞控制
- DNS
- TCP的流量控制
- 基于TCP/IP协议的网络攻击
- nefu488餐巾计划问题【网络流24题】最小费用流
- IOS开发网络篇—数据安全
- iOS开发网络篇—GET请求和POST请求
- IOS开发网络篇—HTTP协议
- [转载]angular通过$http与服务器通信
- Apache Http Server 解决不同域名共用服务器80端口问题