• POST


     

     

     

    /*(http)get请求和post请求的区别:

     *1、post请求 请求地址和参数分离,比get更加安全

     *2、get请求只能获取服务器的数据不能上传文件,而post两者都可以

     *3、get请求在浏览器中字符串长度最大限制为1024,post 没有限制

     *4、post 上传文件 文件大小不能超过4G

     */

     

     

     

    四种body参数的组织方式,对应四种contentType:  (一般都是用默认的第一种)

    1、application/x-www-form-urlencoded   参数拼接形态:a=@"haha"&b=@"hehe"&c=@"houhou"

    2、multipart/form-data   参数为文本或者二进制

    3、application/json  参数为json格式

    4、text/xml 参数为xml格式

     

     

     

     

    【NSURLConnection POST用法】

     

     

    NSURL *url = [NSURL URLWithString:urlStr];

        //post请求用NSMutableURLRequest,可变request的请求头

        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

     

        //设置数据的请求方式(GET/POST)为post请求*****

        [request setHTTPMethod:@"POST"];

     

    //设置请求参数的编码方式(请求头的一部分),可以缺省不写

        [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

     

    //将参数的字符串转换成NSData

    NSData *data = [@"username=111&email=33333&password=22222" dataUsingEncoding:NSUTF8StringEncoding];

     

    //设置参数的长度(请求头的一部分)可以不写

    [request setValue:[NSString stringWithFormat:@"%d",[data length]] forHTTPHeaderField:@"Content-Length"];

     

    //将参数的data作为请求体*****

        [request setHTTPBody:data];

     

    //<NSURLConnectionDataDelegate>

    [NSURLConnection connectionWithRequest:request delegate:self];

     

     

     

     

     

     

    【ASIFormDataRequest POST用法】

     

     

    使用系统相册

     

    1,找开系统相册

    UIImagePickerController *ipc = [[UIImagePickerController alloc]init];//照片选择器

        ipc.delegate = self;//<UIImagePickerControllerDelegate,UINavigationControllerDelegate>

        [self presentViewController:ipc animated:YES completion:nil];

     

     

    //选择照片后触发用post上传

    -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

    {

        NSUserDefaults* ud = [NSUserDefaults standardUserDefaults];

        NSString* urlStr = @"http://192.168.88.8/sns/my/upload_headimage.php";

        NSString* m_auth = [ud objectForKey:@"m_auth"];

     

    //获取点击的图片

        UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];

    //将图片转化为二进制数据

        NSData* headData = UIImagePNGRepresentation(image);

        

    //ASI中,进行post请求和文件上传用ASIFormDataRequest

    //#import "ASIFormDataRequest.h"

        ASIFormDataRequest* request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:urlStr]];

     

    //可以缺省不写

      [request setRequestMethod:@"POST"];

     

    //普通的参数(key=value),如果有多个参数需要多次添加

        [request setPostValue:m_auth forKey:@"m_auth"];

    //[request addPostValue:m_auth forKey:@"m_auth"];

     

    //需要上传文件(转成的二进制数据) fileName:图片的名称,ContentType:上传的文件类型,key为文件对应的参数名称

        [request setData:headData withFileName:@"tmp.png" andContentType:@"image/png" forKey:@"headimage"];

    //[request addData:headData withFileName:@"tmp.png" andContentType:@"image/png" forKey:@"headimage"];

     

    //<ASIHTTPRequestDelegate>

        request.delegate = self;

        [request startAsynchronous];

        

        [picker dismissViewControllerAnimated:YES completion:nil];

    }

     

    //点击照片选择器右侧按钮执行

    -(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker

    {

        [picker dismissViewControllerAnimated:YES completion:nil];

    } 

         

    #import "LoginViewController.h"

    #import "Regist.h"

    #import "ASIFormDataRequest.h"

    #import "HomeViewController.h"

    @interface LoginViewController ()<RegistViewControllerDelegate,ASIHTTPRequestDelegate>

    @property (weak, nonatomic) IBOutlet UITextField *nameTF;

    @property (weak, nonatomic) IBOutlet UITextField *passTF;

     

    @end

     

    @implementation LoginViewController

     

    - (void)viewDidLoad {

        [super viewDidLoad];

        // Do any additional setup after loading the view from its nib.

        self.navigationItem.title=@"Login";

        

        

        

    }

    - (IBAction)btnClick:(UIButton *)sender

    {

        [self.view endEditing:YES];

        if (sender.tag==1) {

            

            //登录接口

            NSString *urlStr=@"http://10.0.8.8/sns/my/login.php";

            

            //用asi窗前post请求需要用这个类

            ASIFormDataRequest *request=[[ASIFormDataRequest alloc]initWithURL:[NSURL URLWithString:urlStr]];

            

            //设置请求方式(asi使用post可以省略)

            [request setRequestMethod:@"POST"];

            

            //添加一个参数

            [request setPostValue:_nameTF.text forKey:@"username"];

            

            //又添加一个参数

            [request setPostValue:_passTF.text forKey:@"password"];

            

            request.delegate=self;

            

            //加载请求

            [request startAsynchronous];

            

        } else {

            Regist *rvc=[[Regist alloc]init];

            rvc.delegate=self;

            [self.navigationController pushViewController:rvc animated:YES];

        }

        

    }

     

    -(void)requestFinished:(ASIHTTPRequest *)request

    {

        NSDictionary *dic=[NSJSONSerialization JSONObjectWithData:request.responseData options:0 error:nil];

        

        if ([[dic objectForKey:@"code"]isEqualToString:@"login_success"]) {

            //用户的身份标记

            NSString *mauth=[dic objectForKey:@"m_auth"];

            

            //将身份标记用mauth这个key存到ud里

            NSUserDefaults *ud=[NSUserDefaults standardUserDefaults];

            [ud setObject:mauth forKey:@"mauth"];

            [ud synchronize];

            

            HomeViewController *hvc=[[HomeViewController alloc]init];

            [self.navigationController pushViewController:hvc animated:YES];

            

            

            return;

        }

        

        UIAlertView *av=[[UIAlertView alloc]initWithTitle:[dic objectForKey:@"code"] message:[dic objectForKey:@"message"] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];

        [av show];

    }

     

    -(void)requestFailed:(ASIHTTPRequest *)request

    {

        NSLog(@"%s",__func__);

    }

     

    -(void)registSuccessWithName:(NSString *)name pass:(NSString *)pass

    {

        _nameTF.text=name;

        _passTF.text=pass;

    }

     

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

    {

        [self.view endEditing:YES];

    }

     

     

    - (void)didReceiveMemoryWarning {

        [super didReceiveMemoryWarning];

        // Dispose of any resources that can be recreated.

    }

     

    /*

    #pragma mark - Navigation

     

    // In a storyboard-based application, you will often want to do a little preparation before navigation

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

        // Get the new view controller using [segue destinationViewController].

        // Pass the selected object to the new view controller.

    }

    */

     

    @end

     

     

    #import <UIKit/UIKit.h>

     

    @protocol RegistViewControllerDelegate <NSObject>

     

    -(void)registSuccessWithName:(NSString *)name pass:(NSString *)pass;

     

    @end

     

    @interface Regist : UIViewController

    @property(nonatomic,assign)id<RegistViewControllerDelegate>delegate;

    @end

     

    #import "Regist.h"

     

    @interface Regist ()<NSURLConnectionDataDelegate,UIAlertViewDelegate>

    {

        NSMutableData *_downloadData;

    }

    @property (weak, nonatomic) IBOutlet UITextField *nameTF;

    @property (weak, nonatomic) IBOutlet UITextField *passTF;

    @property (weak, nonatomic) IBOutlet UITextField *mailTF;

     

    @end

     

    @implementation Regist

     

    - (void)viewDidLoad {

        [super viewDidLoad];

        // Do any additional setup after loading the view from its nib.

        self.navigationItem.title=@"Reglist";

        _downloadData=[[NSMutableData alloc]init];

        

        

        

    }

    - (IBAction)saveClick:(UIButton *)sender {

        [self.view endEditing:YES];

     

        if (!_nameTF.text.length || !_passTF.text.length || !_mailTF.text.length) {

            UIAlertView *av =[[UIAlertView alloc]initWithTitle:@"Massage" message:@"Please Write things" delegate:nil cancelButtonTitle:@"Yes" otherButtonTitles: nil];

            [av show];

            return;

        }

        

        //所有参数拼接成的字符串,作为请求体

        NSString *bodyStr=[NSString stringWithFormat:@"username=%@&password=%@&email=%@",_nameTF.text,_passTF.text,_mailTF.text];

        

        //接口(网址)部分,作为请求头

        NSString *urlStr=@"http://10.0.8.8/sns/my/register.php";

        

        NSURL *url=[NSURL URLWithString:urlStr];

        

        //使用post联网需要可变的request

        NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:15];

        

        //设置请求方式为POST(POST/GET)

        [request setHTTPMethod:@"POST"];

        

        //设置请求体(需要把参数的字符串转化成NSData)

        [request setHTTPBody:[bodyStr dataUsingEncoding:NSUTF8StringEncoding]];

        

        //加载请求

        [NSURLConnection connectionWithRequest:request delegate:self];

        

        [UIApplication sharedApplication].networkActivityIndicatorVisible=YES;

        

    }

     

    #pragma mark - NSRULConnection

     

    -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

    {

        _downloadData.length=0;

    }

     

    -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

    {

        [_downloadData appendData:data];

    }

     

    -(void)connectionDidFinishLoading:(NSURLConnection *)connection

    {

        [UIApplication sharedApplication].networkActivityIndicatorVisible=NO;

        

        NSDictionary *dic=[NSJSONSerialization JSONObjectWithData:_downloadData options:0 error:nil];

        

        UIAlertView *av=[[UIAlertView alloc]initWithTitle:[dic objectForKey:@"code"] message:[dic objectForKey:@"message"] delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];

        [av show];

        if ([[dic objectForKey:@"code"] isEqualToString:@"registered"]) {

            av.tag = 1;

        }

        [av show];

    }

     

    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

    {

        if (alertView.tag == 1) {

            [self.navigationController popToRootViewControllerAnimated:YES];

            [self.delegate registSuccessWithName:_nameTF.text pass:_passTF.text];

        } else {

            

        }

    }

     

    -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

    {

        [UIApplication sharedApplication].networkActivityIndicatorVisible=NO;

        NSLog(@"%s",__func__);

    }

     

     

     

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

    {

        [self.view endEditing:YES];

    }

     

    - (void)didReceiveMemoryWarning {

        [super didReceiveMemoryWarning];

        // Dispose of any resources that can be recreated.

    }

     

    /*

    #pragma mark - Navigation

     

    // In a storyboard-based application, you will often want to do a little preparation before navigation

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

        // Get the new view controller using [segue destinationViewController].

        // Pass the selected object to the new view controller.

    }

    */

     

    @end

     

    #import "HomeViewController.h"

    #import "ASIFormDataRequest.h"

    @interface HomeViewController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate,ASIHTTPRequestDelegate>

    {

        //图片选择控制器

        UIImagePickerController *_ipc;

    }

    @property (weak, nonatomic) IBOutlet UIImageView *headView;

     

    @end

     

    @implementation HomeViewController

     

    - (void)viewDidLoad {

        [super viewDidLoad];

        // Do any additional setup after loading the view from its nib.

    }

    - (IBAction)btnClick:(UIButton *)sender {

        if (!_ipc) {

            _ipc=[[UIImagePickerController alloc]init];

        }

        _ipc.delegate=self;

        

        [self presentViewController:_ipc animated:YES completion:nil];

    }

     

    -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

    {

        NSLog(@"%@",info);

        

        //将点击的图片显示到headView上

        _headView.image=[info objectForKey:UIImagePickerControllerOriginalImage];

        

        NSUserDefaults *ud=[NSUserDefaults standardUserDefaults];

        NSString *mauth=[ud objectForKey:@"mauth"];

        

        //创建一个asi的post请求

        ASIFormDataRequest *request=[ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://10.0.8.8/sns/my/upload_headimage.php"]];

        

        //告诉服务器,要为哪个用户上传头像

        [request setPostValue:mauth forKey:@"m_auth"];

        

        //将图片转成NSData

        NSData *imageData=UIImagePNGRepresentation(_headView.image);

        

        //将图片转成NSData,第二个参数图片名,供后台参考,第三个文件类型,图片就用image/png,最后一个参数是后台规定的参数名

        [request setData:imageData withFileName:@"2.png" andContentType:@"image/png" forKey:@"headimage"];

        

        request.delegate=self;

        [request startAsynchronous];

        

        //让对应的图片选择器退出

        [picker dismissViewControllerAnimated:YES completion:nil];

    }

     

    -(void)requestFinished:(ASIHTTPRequest *)request

    {

        NSDictionary *dic=[NSJSONSerialization JSONObjectWithData:request.responseData options:0 error:nil];

        

        UIAlertView *av=[[UIAlertView alloc]initWithTitle:[dic objectForKey:@"code"] message:[dic objectForKey:@"message"] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];

        [av show];

    }

     

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

    {

        [self.view endEditing:YES];

    }

     

    - (void)didReceiveMemoryWarning {

        [super didReceiveMemoryWarning];

        // Dispose of any resources that can be recreated.

    }

     

    /*

    #pragma mark - Navigation

     

    // In a storyboard-based application, you will often want to do a little preparation before navigation

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

        // Get the new view controller using [segue destinationViewController].

        // Pass the selected object to the new view controller.

    }

    */

     

    @end

    让明天,不后悔今天的所作所为
  • 相关阅读:
    周学习笔记(04)——大三下
    进度(3)
    进度(2)
    进度(1)
    周学习笔记(03)——大三下
    《信息领域热词分析》之在代码层实现可用性战术
    周学习笔记(02)——大三下
    cf1041E
    cf1067b
    cf1131D
  • 原文地址:https://www.cnblogs.com/-yun/p/4390945.html
Copyright © 2020-2023  润新知