1、HTTP定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST.
HTTP-GET和HTTP-POST是使用HTTP的标准协议动词,用于编码和传送变量名/变量值对参数,并且使用相关的请求语义。每个HTTP-GET和HTTP-POST都由一系列HTTP请求头组成,这些请求头定义了客户端从服务器请求了什么,而响应则是由一系列HTTP应答头和应答数据组成,如果请求成功则返回应答。
HTTP-GET以使用MIME类型application/x-www-form-urlencoded的urlencoded文本的格式传递参数。Urlencoding是一种字符编码,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是"%20"。附加参数还能被认为是一个查询字符串。
与HTTP-GET类似,HTTP-POST参数也是被URL编码的。然而,变量名/变量值不作为URL的一部分被传送,而是放在实际的HTTP请求消息内部被传送。
(1)get是从服务器上获取数据,post是向服务器传送数据。
(2) 在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。
(3) 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
(4) GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
(5) 安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。
简而言之,GET请求,将参数直接写在访问路径上。操作简单,不过容易被外界看到,安全性不高;POST请求,POST请求操作相对复杂,需要将参数和地址分开,不过安全性高,参数放在body里面,不易被捕获。
2、代码实现
首先创建一个单视图的工程,在xib文件添加控件,布局如下:
并将控件与.h文件关联,在视图控制器的.h文件里生成代码如下(还需要遵守NSURLConnectionDataDelegate协议):
#import
@interface ViewController :UIViewController<NSURLConnectionDataDelegate>
{
//用来保存接收到的数据
NSMutableString *_resltStr;
}
@property (retain,nonatomic)IBOutletUITextField *textFieldUserId;
@property (retain,nonatomic)IBOutletUITextField *textFieldInput;
- (IBAction)pressedButton:(id)sender;
@property (retain,nonatomic)IBOutletUILabel *labelResult;
@end
{
[superviewDidLoad];
//标签栏行数
self.labelResult.numberOfLines =3;
//设置背景图片
UIImage *image = [UIImageimageNamed:@"8"];
UIImageView *pView = [[UIImageViewalloc]initWithImage:image];
[self.viewinsertSubview:pViewatIndex:0];
[pViewrelease];
}
{
//1、用GET方法发送请求
/*NSString *pStr1 = self.textFieldInput.text;
NSString *pStr2 = self.textFieldUserId.text;
NSString *strUrl1 = [@"mobileCode=" stringByAppendingString:pStr1];
NSString *strUrl2 = [@"&userID=" stringByAppendingString:pStr2];
NSString *strUrl = [strUrl1 stringByAppendingString:strUrl2];
//获得最终路径
NSString *strUr = [@"http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo?" stringByAppendingFormat:@"%@",strUrl];
NSURL *pUrl = [NSURL URLWithString:strUr];
NSLog(@"strur = %@",strUr);
//NSURLRequest初始化方法第一个参数:请求访问路径,第二个参数:缓存协议,第三个参数:网络请求超时时间(秒)
NSURLRequest *pRequest = [NSURLRequest requestWithURL:pUrl cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
[NSURLConnection connectionWithRequest:pRequest delegate:self];*/
//2、用POST方法获得
//获取网络路径字符串(与Get请求的第一个区别点(不带参数,参数附件在body体里))
NSString *postStr =@"http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo";
//将字符串转化为URL
NSURL *postUrl = [NSURLURLWithString:postStr];
//创建请求(第二个区别:请求为NSMutableURLRequest)
NSMutableURLRequest *postRequest = [NSMutableURLRequestrequestWithURL:postUrlcachePolicy:NSURLRequestUseProtocolCachePolicytimeoutInterval:60];
//将请求的参数做成一个字符串
NSString *postMobileAndUserID = [NSStringstringWithFormat:@"mobileCode=%@&userID=%@",self.textFieldInput.text,self.textFieldUserId.text];
//将该字符串转化成NSData
NSData *postData = [postMobileAndUserIDdataUsingEncoding:NSUTF8StringEncoding];
//设置请求的参数和方法
//第三个区别点(将参数作为Body体)
[postRequestsetHTTPBody:postData];
//第四点(必须手动声明当前的请求方式为POST)
[postRequestsetHTTPMethod:@"POST"];
//发送请求
[NSURLConnectionconnectionWithRequest:postRequestdelegate:self];
}
#pragma NSURLConnectionDataDelegate协议里的一些方法
//服务器开始响应时调用该方法
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"服务器响应");
//初始化
_resltStr = [[NSMutableStringalloc]init];
}
//服务器接收数据时调用该方法
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSLog(@"接收数据");
//将data通过UTF8的编码方式转换为字符串
NSString *pstr = [[NSStringalloc]initWithData:dataencoding:NSUTF8StringEncoding];
//放到存储结果的字符串中
[_resltStrappendString:pstr];
//打印输出
NSLog(@"_resltStr = %@",_resltStr);
}
//数据接受失败时调用该方法
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"数据加载失败,原因:%@",error);
}
//数据接收完毕后调用该方法
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"数据接收完毕");
//在返回的字符串里截取结果
self.labelResult.text = pTemp;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.viewendEditing:YES];
}
@end