IOS:基于GET和POST方法的国内手机号码归属地查询系统



     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 <UIKit/UIKit.h>


@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


    接下来在实现文件里,分别用了GET和POST两种方法来实现,不过,我已经注释了GET方法,但是有详细说明。

     设置背景图片和显示结果的标签栏的行数

  - ( void )viewDidLoad

{

    [superviewDidLoad];

    //标签栏行数

    self.labelResult.numberOfLines =3;

    //设置背景图片

   UIImage *image = [UIImageimageNamed:@"8"];

    

   UIImageView *pView = [[UIImageViewalloc]initWithImage:image];

    

    [self.viewinsertSubview:pViewatIndex:0];

    

    [pViewrelease];

}



    和按钮关联的方法:

- ( IBAction )pressedButton:( id )sender

{

    //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(@"数据接收完毕");

    

    //在返回的字符串里截取结果

    NSString *pTemp = [_resltStrsubstringWithRange:NSMakeRange(78,26)];

    

   self.labelResult.text = pTemp;

}


   
    因为我们添加了文本框控件,所以还要定义让键盘弹回的方法。

// 触摸屏幕让键盘弹回的方法

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

    [self.viewendEditing:YES];

}

@end


   最后,运行,结果如下:

     

     输入手机号码(最少7位),用户ID不填,点击“查询”按钮,结果如下:

     

   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值