Get、Post(HTTP中最常用的请求方式 使用ASIHTTPRequest)----例如:登录、上传图片(调用手机相册 UIImage 转为data)

来源:互联网 发布:计算机程序员考试试题 编辑:程序博客网 时间:2024/05/21 09:53

HTTP:超文本传输协议,它定义了一种在网络间传输数据的格式。


    HTTP的请求方式有八种,最常用的就是GET和POST,剩下的几种方式都可以使用GET或者POST来实现,所以他们都使用的很少,即使是在服务器端,也很少使用。


    GET:

            使用get方式请求,参数可以直接加在路径后面,例如:http://localhost:8080/login.actin?uname=XXXX&pwd=XXX

            因为在iOS开发中,请求路径都是在程序代码里,所以不会向浏览器那样直接将用户名或者密码显示出来,被其他人看见。



    注意:1:  iOS开发中,不论get和post请求都不能在请求中直接加入中文,( 这与浏览器端不一样,因为浏览器端在发送数据到服务器端时,中文会自动转码)中文必须经过转码的方式,才能发送。

UTF-8转化

    NSString *data = @"你好,北京!";

    //转换成UTF-8

    NSString *dataUTF8 = [data stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSLog(@"%@",dataUTF8);

    


//解码 —————— UTF-8GBK,将UTF8代码替换。

    NSString *dataGBK = [dataUTF8 stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSLog(@"%@",dataGBK);



               2:虽然在iOS中使用get方式可以直接带参数,但是一般涉及到重要数据时,例如:用户名,密码,此时还是使用post方式,因为它更安全,如果使用get方式发送,虽然正常来说看不见,但是只要用到了抓包工具,就很容易被别人查看到一些信息。


     POST:

      使用post请求,参数放到post请求体中。

     请求体:有标准的post请求体, 参数在标准请求体中都是以  键--值 对的形式存在。(常用)

                    非标准post请求体,这种请求体是自定义的请求体,例如:(soap)(不常用)


     标准请求体:规则的 键 -- 值 对。

-----------------------------------------------------

   普通 POST请求简单快速使用:ASIFormDataRequest,需要包含 #import”ASIFormDataRequest.h“;

-----------------------------------------

  
NSString *postURL = [NSString stringWithFormat:@"http://xxxxxx.php"];


ASIFormDataRequest *request = [[ASIFormDataRequest alloc] initWithURL:[NSURLURLWithString:postURL]];


//设置post参数。
[request addPostValue:myModel forKey:@"mod"];


[request addPostValue:myAllData forKey:@"data"];



[request startSynchronous];


     -------------------------------------------------------------

上传图片:从客户端传递数据到服务器端:

     -------------------------------------------------------------

    NSURL* url=[NSURLURLWithString:@"http://localhost:8080/my/upload_headimage.php"];

   

    ASIFormDataRequest *request=[ASIFormDataRequestrequestWithURL:url];

    request.tag=20;

    request.delegate=self;

    

    //设置请求方式

    [requestsetRequestMethod:@"POST"];

    

    

   /**

                请求体

         */

    //标准的POST的请求体的格式,键-值对

    //传入token

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

    

    //传入头像

    

    //头像参数,将图片转为NSData

    NSData* data =UIImagePNGRepresentation(self.picImageView.image);


   /*

                UIImage 转为data的方法有两种:

                一种是UIImageJPEGRepresentation,一种是UIImagePNGRepresentation

                前者获取到图片的数据量要比后者的小很多。

         */

    //将图片数据,设置到请求体中,还是一键值对的方法,但是必须的指明 文件名(自己取的,可以和原来的图片不一样) 类型(image/png必须与前面图片转NSData类型得一致)

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

    

    

    [request startAsynchronous];



    不标准的请求体,即自定义请求体:

     原理,post请求的请求中,任何数据结构的二进制都可以被post发送。

     当服务器和客户端,达成一致,就可以使用自定义的请求体。那么该怎么来post发送呢??



     1:按照服务端给出了post请求体的格式,创建请求体的数据结构。(其实最简单的办法的就是直接写出NSString,这样可以快速的创建自定义的请求体的数据结构)

           例如:

 NSString *xmlStr=@"<?xml version=\"1.0\" encoding=\"utf-8\"?>\

    <soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">\

    <soap12:Body>\

    <getWeatherbyCityName xmlns=\"http://WebXml.com.cn/\">\

    <theCityName>北京</theCityName>\

    </getWeatherbyCityName>\

    </soap12:Body>\

    </soap12:Envelope>";

这是一个SOAP协议下的请求体,SOAP定义了这个格式。最简单的创建办法就是直接将其创建到NSString中。

然后直接修改其中的参数即可,如果中文传入后不正确,那么中文就应该需要转码一下,在发送。


 2:将请求体的数据结构转码为NSData(序列化)。

   

    NSData *body=[xmlStr dataUsingEncoding:NSUTF8StringEncoding];


 3:使用自带框架  或者 第三方库,发送post请求
    

       //使用   ASIHTTPRequest  发送post请求

    

    

    ASIHTTPRequest *request=[ASIHTTPRequestrequestWithURL:url];

    request.tag=10;

    request.delegate=self;

    

    //设置POST请求方式

    [requestsetRequestMethod:@"POST"];

    //设置请求头   

    [request addRequestHeader:@"Content-Type"value:@"application/x-www-form-data"];//默认的的就是:Content-Type application/x-www-form-data

    [request addRequestHeader:@"Content-Length"value:[NSStringstringWithFormat:@"%d",requestData.length]];

    

    //设置请求体

    [request setPostBody:body];

    //异步发送请求

    [request startAsynchronous];


   





0 0
原创粉丝点击