网络分层结构.png
http 通信流程.png
一 GET请求和POST请求的区别
GET请求和POST请求的区别主要是体现在数据的传递上.
GET请求相对于POST请求是不安全的
-
GET请求:
在请求的URL后面一 '?'的形式跟上发给服务器的参数,多个参数之间以'&'隔开比如:http://www.baidu.com/login?usrName=zhangsan&pwd=123456&type=json
由于浏览器和服务器对URL的长度有限制,因此在URL后面附带参数是由限制的,通常不超多1kb.
POST 请求
发送个服务器的参数全部放在请求体中
理论上POST请求体传递的数据是没有限制的
二 HTTP请求过程----请求
HTTP 协议规定: 一个完整的由客户端发送给服务器的HTTP 请求中包含以下内容.
- 请求头 包含了 对客户端的环境描述,客户端的请求信息等.
GET /xiaoming.png HTTP/1.1 // 包含了请求方法 请求路径 HTTP协议的版本
Host: 120.25.226.186:12345 // 客户端想访问服务器的主机地址
User-Agent: Mozilla/5.0 //客户端的类型,客户端的软件环境
Accept: text/html // 客户端所能接受的数据类型
Accept-Language: zh cn //客户端语言环境
Accept-Encoding: gzip //客户端支持的数据压缩格式
- 请求体: 客户端 发送给服务器的具体数据,比如文件数据. (请求体不是必须的,比如GET请求)
二 HTTP请求过程----相应
- 客户端 向服务器 发送请求,服务器应当做出相应,即返数据给客户端
- HTTP协议规定: 1个完整的相应体中应包含以下几个部分:
响应头:包含对服务器的描述,对返回数据的描述
响应体 服务器返给客户端的具体数据,比如文件数据HTTP/1.1 200 ok //http 的版本 状态 Server: Apache-Coyote/1.1 // 服务器的类型 Content-Type: image/jpeg // 返回数据的类型 Content-Length: 56811 //返回数据的长度 Date: Mon jun 2015 12:29:53 GMT // 相应时间
三 HTTP请求状态码类别含义
类别 | 原因短语 | 解释 | 比如 |
---|---|---|---|
1xx开头 | 信息性状态码 | 接收的请求正在处理 | |
2xx开头 | 成功状态码 | 请求正常处理完毕 | 比如:200 表示成功 |
3xx开头 | 重定向状态码 | 要完成附加请求操作以完成请求 | |
4xx开头 | 客户端错误 | 客户端错误 | 比如:404 请求路径错误,客户端传错了 |
5xx开头 | 服务端错误 | 服务端错误 | 比如:500 服务器出错 |
四 iOS中HTTP GET 请求
- NSURLConnection 发送同步请求 GET
-(void)sendsync{
// 1. 确定请求路径 (GET 请求: 基础路劲 + 参数)
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:12345/logo?usr=zhangsan&pwd=123456"];
// 2. 创建请求对象 (该对象内部会默认 生成请求头), GET 请求没有请求体
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 3. 发送请求
NSURLResponse *response = nil; // 响应头
NSError *err = nil;
// 4.返回请求的响应数据
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
NSLog(@"data : %@",data);
}
- NSURLConnection 发送异步请求 GET
- (void)sendAsync{
// 1. 确定请求路径 (GET 请求: 基础路劲 + 参数)
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:12345/logo?usr=zhangsan&pwd=123456"];
// 2. 创建请求对象 (该对象内部会默认 生成请求头), GET 请求没有请求体
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 3. 发送请求synchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { // 响应数据
NSLog(@"response: %@, data: %@,connectionError : %@",response, data, connectionError);
}];
}
- NSURLConnection 发送请求 代理接收响应数据 GET
@interface TestViewController ()<NSURLConnectionDataDelegate>
@end
@implementation TestViewController
- (void)sendAsyncDelegate{
// 1. 确定请求路径 (GET 请求: 基础路劲 + 参数)
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:12345/logo?usr=zhangsan&pwd=123456"];
// 2. 创建请求对象 (该对象内部会默认 生成请求头), GET 请求没有请求体
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 3. 发送请求
[[NSURLConnection alloc] initWithRequest:request delegate:self];
//startImmediately:NO 时,不会立即发送请求需要手动调用start 发送请求
//NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
//[connection start];
}
#pragma mark- NSURLConnectionDataDelegate
// 1 接收到相应头调用
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
}
//2.接收到数据调用, 该方法可能被调用多次
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
}
// 3. 完成后调用
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
}
//4. 失败时调用
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
}
五 iOS中HTTP POST 请求
- (void)sendAsyncPOST{
// 1. 确定请求路径 (GET 请求: 基础路劲 + 参数)
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:12345/logo"];
// 2. 创建请求对象 (该对象内部会默认 生成请求头)
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 2.1如果请求头的信息不满足可以自己修改
[request setValue:@"ios 10.2" forHTTPHeaderField:@"User-Agent"];
// 2.2设置请求超时时间
request.timeoutInterval = 15;
//3.设置请求方式
request.HTTPMethod = @"POST";
//4.设置请求体
request.HTTPBody = [@"usr=zhangsan&pwd=123456" dataUsingEncoding:NSUTF8StringEncoding];
// 3. 发送请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
// 处理相应信息
}];
}
五 URL转码
在使用URL的时候,如果字符串中设计到中文,那么需要对中文进行转码
NSString *urlStr = @"http://120.25.226.186:12345/logo?usr=张三&pwd=12345";
NSURL *url = [NSURL URLWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];