一、HTTP通信过程
1.HTTP通信过程 - 请求
HTTP协议规定:1个完整的由客户端发给服务器的HTTP请求中包含以下内容
请求行:包含了请求方法、请求资源路径、HTTP协议版本
GET /MJServer/resources/images/1.jpg HTTP/1.1
请求头:包含了对客户端的环境描述、客户端请求的主机地址等信息
Host: 192.168.1.105:8080 // 客户端想访问的服务器主机地址
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9) Firefox/30.0// 客户端的类型,客户端的软件环境
Accept: text/html, */*// 客户端所能接收的数据类型
Accept-Language: zh-cn // 客户端的语言环境
Accept-Encoding: gzip // 客户端支持的数据压缩格式
请求体:客户端发给服务器的具体数据,比如文件数据
2.HTTP通信过程 - 响应
客户端向服务器发送请求,服务器应当做出响应,即返回数据给客户端
HTTP协议规定:1个完整的HTTP响应中包含以下内容:
状态行:包含了HTTP协议版本、状态码、状态英文名称
HTTP/1.1 200 OK
响应头:包含了对服务器的描述、对返回数据的描述
Server: Apache-Coyote/1.1 // 服务器的类型
Content-Type: image/jpeg // 返回数据的类型
Content-Length: 56811 // 返回数据的长度
Date: Mon, 23 Jun 2014 12:54:52 GMT // 响应的时间
实体内容:服务器返回给客户端的具体数据,比如文件数据
3.iOS中发送HTTP请求的方案
在iOS中,常见的发送HTTP请求(GET和POST)的解决方案有
(1)苹果原生
NSURLConnection:用法简单,最古老最经典最直接的一种方案
NSURLSession:iOS 7新出的技术,功能比NSURLConnection更加强大
CFNetwork:NSURL*的底层,纯C语言
(2)第三方框架
ASIHttpRequest:外号“HTTP终结者”,功能极其强大,可惜早已停止更新
AFNetworking:简单易用,提供了基本够用的常用功能
4. 不多说,直接上代码:
1. http get 和post 两种调用方式
NSString *retString = nil;
if ([szHttpType isEqualToString:@"GET"])
{
retString = [http httpGet:aUrl queryString:queryString];
}
else if (!aFiles || [aFiles count] == 0)
{
retString = [http httpPost:aUrl queryString:queryString];
}2. 对 get 和 post 的简单封装
- (NSString *)httpGet:(NSString *)aUrl queryString:(NSString *)aQueryString
{
NSMutableURLRequest *request = [self requestGet:aUrl queryString:aQueryString];
return [self getResponseWithRequest:request];
}
- (NSString *)httpPost:(NSString *)aUrl queryString:(NSString *)aQueryString
{
NSMutableURLRequest *request = [self requestPost:aUrl queryString:aQueryString];
return [self getResponseWithRequest:request];
}
- (NSString *)getResponseWithRequest:(NSURLRequest *)request
{
NSURLResponse *response = nil;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
NSString *retString = [[[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding] autorelease];
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
NSLog(@"response code:%d string:%@", httpResponse.statusCode, retString);
return retString;
}
- (NSMutableURLRequest *)requestGet:(NSString *)aUrl queryString:(NSString *)aQueryString
{
NSMutableString *url = [[NSMutableString alloc] initWithString:aUrl];
if (aQueryString) {
[url appendFormat:@"?%@", aQueryString];
}
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] initWithURL:[NSURL smartURLForString:url]] autorelease];
[request setHTTPMethod:@"GET"];
[request setTimeoutInterval:20.0f];
[url release];
return request;
}
- (NSMutableURLRequest *)requestPost:(NSString *)aUrl queryString:(NSString *)aQueryString
{
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] initWithURL:[NSURL smartURLForString:aUrl]] autorelease];
[request setHTTPMethod:@"POST"];
[request setTimeoutInterval:20.0f];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:[aQueryString dataUsingEncoding:NSUTF8StringEncoding]];
return request;
}