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-8转GBK,将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:[NSURL URLWithString: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];
//使用 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];