一、网络通信的本质
数据传输,数据交换
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