网络

HTTP 通信过程 - 请求

  • HTTP协议规定:一个完整的由客户端发给服务器的HTTP请求中包含以下内容
    • 请求头:包含了对客户端的环境描述、客户端请求信息等
      GET /minion.png HTTP/1.1 包含了请求方法、请求资源路径、HTTP协议版本 Host:120.25.226.186.3281 客户端想访问的服务器主机地址 User-Agent: Mozilla/5.0 客户端的类型,客户端的软件环境 Accept:text/html,*/* 客户端所能接收的数据类型 Accept-Language:客户端的语言环境 Accept-Encoding:客户端支持的数据压缩格式
    • 请求体:客户端发给服务器的具体数据,比如文件数据(POST请求才会有)

HTTP 通信过程 - 响应

  • 客户端向服务器发送请求,服务器应当做出响应,即返回数据给客户端
  • HTTP协议规定:1个完整的HTTP响应中包含以下内容
    • 响应头:包含了对服务器的描述、对返回数据的描述
      HTTP/1.1 200 OK 包含了HTTP协议版本、状态码、状态英文名称 Server:Apache-Coyote/1.1 服务器的类型 Content-Type:image/jpeg 返回数据的类型 Content-Length:56811 返回数据的长度 Date:Mon,23 Jun 2014 12:54:52 GMT 响应的时间
    • 响应体:服务器返回给客户端的具体数据,比如文件数据

HTTP请求的常见方法

  • GET
    • 所有参数拼接在URL后面,并且参数之间用&隔开
    • 没有请求体
    • 一般用来查询数据
  • POST
    • 所有参数都放在请求体
    • 一般用来修改、增加、删除数据

创建HTTP请求

  • GET
// 请求路径
NSString *urlStr = @"http://120.25.226.186:32812/login2?username=小码哥&pwd=520it";
urlStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
// 创建URL
NSURL *url = [NSURL URLWithString:urlStr];
// 创建请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 设置请求方法
request.HTTPMethod = @"GET";
  • POST
// 请求路径
NSString *urlStr = @"http://120.25.226.186:32812/login2";
urlStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
// 创建URL
NSURL *url = [NSURL URLWithString:urlStr];
// 创建请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 设置请求方法(默认就是GET请求)
request.HTTPMethod = @"POST";
// 设置请求体
request.HTTPBody = [@"name=张三" dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];

使用NSURLConnection发送请求

  • 发送同步请求
  + (nullable NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse * _Nullable * _Nullable)response error:(NSError **)error
// 这个方法是阻塞式的,当服务器的数据完全返回时,这个方法才会返回,代码才会继续执行
  • 发送异步请求-block
  + (void)sendAsynchronousRequest:(NSURLRequest*) request
                          queue:(NSOperationQueue*) queue
              completionHandler:(void (^)(NSURLResponse* _Nullable response, NSData* _Nullable data, NSError* _Nullable connectionError)) handler
// 会自动开启一个子线程去发送请求
// 当请求完毕(成功/失败),会自动调用handle这个block
// handle这个block会放到queue这个队列中执行
  • 发送异步请求-delegate
  - (nullable instancetype)initWithRequest:(NSURLRequest *)request delegate:(nullable id)delegate startImmediately:(BOOL)startImmediately;// startImmediately==YES,也自动发送异步请求
 - (nullable instancetype)initWithRequest:(NSURLRequest *)request delegate:(nullable id)delegate; // 创建完毕后,自动发送异步请求
 + (nullable NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(nullable id)delegate; // 创建完毕后,自动发送异步请求
  • 遵守NSURLConnectionDataDelegate协议,实现协议中的代理方法
// 当接收到服务器的响应时就会调用 
  - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
// 当接收到服务器返回的数据时就会调用1次(数据量大的时候,就会调用多次)
  - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
// 当服务器的数据完全返回时调用
  - (void)connectionDidFinishLoading:(NSURLConnection *)connection;
// 当请求失败的时候调用
  - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;

你可能感兴趣的:(网络)