iOS 网络基本剖析
一、网络通信的本质
数据传输,数据交换
Client 《======》 服务器
二、HTTP、TCP,IP、UDP、Socket关系刨析
Socket:套接字,是一个用于网络传输数据的工具
1.TCP/IP:传输协议,用于定义网络传输数据格式
2.UDP:传输协议,用于定义网络传输数据格式
HTTP:超文本传输协议,用于定义网络传输数据的格式(短连接)
http请求,只能给服务器发,客户端不能接受http请求
XMPP:(基于TCP/IP协议封装的一套协议,不属于网络通用的 )
长短链接的区别:
长连接(TCP)
三、HTTP协议中的请求类型(增/PUT、删/DELETE、查/GET、改POST)
还有OPTION/HEAD/TRACE/CONNECT 等,其中最主要的,也是最常用的为GET、POST
四、HTTP请求的组成部分
http 一般情况下包含三个部分:请求行,请求头,请求体
- 请求行(Request Line)
请求行由三个标记组成:请求方法、请求 URI 和 HTTP 版本,它们用空格分隔。
例如:GET /news.asp HTTP/1.1
- 消息头(Message Headers)
由域名/值对组成,每行一对,域名和值之间用紧跟的英文冒号(“:”),单空格(SP)分开。消息头通知服务器有关于客户端的功能和标识。如 Host: http://demo.com:80 表示请求的资源所在的主机和端口号,在 HTTP/1.1 协议中,Host 消息头是必选的。还可以有其他一些如 Accept-Charset、Accept-Encoding、Authorization 等等,详见 RFC1945,RFC2616。
- 消息体(Entity Body)<只有在POST请求中才有消息体>
HTTP 消息的消息体(如果存在),用于携带与请求相关联的数据,例如可以存一些请求需要的参数等。由消息头中的 Content-Length 或 Transfer-Encoding 来指示。消息头里的 Content-Type 说明了数据的传输类型。
下面是一个HTTP请求的例子:
————————————————————————请求行————————————————————————————
GET/sample.jspHTTP/1.1 //请求方式,URL,协议版本
————————————————————————分割线————————————————————————————
Accept:image/gif.image/jpeg,*/* //客户端 可接受数据类型
Accept-Language:zh-cn // 客户端的语言环境
Host:localhost // 客户端祥访问的服务器主机地址
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0) //客户端的类型,以及客户端的软件环境
Accept-Encoding:gzip,deflate //客户端支持的数据压缩格式
————————————————————————分割线————————————————————————————
username=jinqiao&password=1234 //使用POST请求时,才会存在请求体,需要传递给服务器的数据
URL: http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo?mobileCode=13301330133&userID=
五、HTTP请求返回码以及响应数据
1xx - 信息提示
2xx - 成功
3xx - 重定向
4xx - 客户端错误
5xx - 服务器错误
http请求返回码大全:http://blog.csdn.net/wangsen2235068/article/details/8081274
请求体(只有post请求才有请求体(NSData类型,所以,地址栏不可见))
userName=13301330133&userID=
【http响应】
响应头
如果状态是200表示成功,404的话则是表示为找到网页
【响应体】
六、HTTP请求的方案
1.NSURLCollection
2.NSURLSession
3.CFNetWorking
4.AFNetWorking(第三方)、YTKNetworking、ASIHttpRequest(不维护)
七、网络请求的具体使用(NSRULConnection)
什么时候用GET请求,什么时候用POST请求?二者的区别
GET
GET的语义是获取指定URL上的资源
将数据按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,各个变量之间使用“&”连接
不安全,因为在传输过程中,数据被放在请求的URL中
传输的数据量小,这主要是因为受URL长度限制
POST
POST的语意是对指定资源“追加/添加”数据
将数据放在数据体中,按照变量和值相对应的方式,传递到action所指向URL
所有数据对用户来说不可见
可以传输大量数据,上传文件只能使用Post
Http请求主要由两部分组成:http请求头、http请求体
POST请求才有请求体
请求的参数有两种形式:1.放在URL后面 (get请求)
2.放在请求体重(post请求)
a.网络请求部分
使用BLOCK完成
1.GET请求
1.NSURL
2.NSURLRequest
3.NSURLConnection
//直接发送异步请求方法
+sendAsynchronousRequest:
// 同步请求(阻塞线程)
+(NSData *)sendSynchronousRequest:
2.POST请求
1.NSURL
2.NSMutableURLRequest
需要设置 HTTPMethod,HTTPBody
muRequest.HTTPMethod = @"POST";
//如果有中文,就进行UTF8编码
muRequest.HTTPBody = [string dataUsingEncoding:NSUTF8StringEncoding];
3.NSURLConnection
//直接发送异步请求方法
+sendAsynchronousRequest:
// 同步请求(阻塞线程)
+(NSData *)sendSynchronousRequest:
使用代理完成
GET:
1.NSURL
2.NSURLRequest
3.NSURLConnection
// 设置代理,并开始(NSURLConnectionDataDelegate)
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
[connection start];
POST:
需要设置 HTTPMethod,HTTPBody
muRequest.HTTPMethod = @"POST";
//如果有中文,就进行UTF8编码
muRequest.HTTPBody = [string dataUsingEncoding:NSUTF8StringEncoding];
https://www.showapi.com/api/lookPoint/341/1文本笑话接口
基于该接口,做一个页面(包含,网络请求,数据解析,数据展示)
b. 数据下载部分
下载资源路径:
@"http://7xawdc.com2.z0.glb.qiniucdn.com/o_19p6vdmi9148s16fs1ptehbm1vd59.mp4"
使用代理完成(检测下载进度)
使用代理完成
GET:
1.NSURL
2.NSURLRequest
3.NSURLConnection
// 设置代理,并开始(NSURLConnectionDataDelegate)
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
[connection start];
POST:
1.NSURL
2.NSMutableURLRequest
需要设置 HTTPMethod,HTTPBody
muRequest.HTTPMethod = @"POST";
//如果有中文,就进行UTF8编码
muRequest.HTTPBody = [string dataUsingEncoding:NSUTF8StringEncoding];
3.NSURLConnection
// 设置代理,并开始(NSURLConnectionDataDelegate)
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
[connection start];
协议中的方法
//服务器做出响应(response.suggestedFilename:文件名字 response.expectedContentLength)
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
//接受数据(根据数据量大小,多次响应)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
//失败方法
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
最新文章
- Java 快速排序两种实现
- CentOS下安装使用start-stop-daemon
- C#在函数内部获取函数的参数
- 快速理解-Ajax
- 简单回顾NPOI导入导出excel文件
- jquery validate表单验证插件
- 说说无耻的商河水木清华开发商2013";交房
- 【python】类变量和对象变量
- BP(back propagation)反向传播
- Linux之重定向
- Get value from agent failed: cannot connect to [[192.168.186.130]:10050]: [113]No route to host
- 解决页面插入HTML代码后错位(HTML代码里的标签不完整导致错位)
- angularJS自定义指令scope代替link
- c# 将文本中的数据快速导入到数据库(200万左右的数据量)
- SPRING STS Virgo OSGI 开发一 : bundle 项目的创建
- 数据库(MSSQLServer,Oracle,DB2,MySql)常见语句以及问题
- sublime c++ builder
- 关于Kingfisher--备用
- 通过案例练习掌握SSH 的整合
- [PCB设计] 4、BAT脚本处理AD生成的GERBER文件为生产文件