在http请求中有两个非常重要的header,分别是get和post。对于百度这类的服务器访问,不需要传递什么参数,方便快捷迅速的访问,大多用的是get。而需要输入账号密码或者传递信息(图片等)的时候,采用的则是post请求。
(一)get:
get请求可以被缓存。get请求时输入的数据是会显示在“网址”上的,通常?后面键值的方式追加参数,多个参数由&连接。并且参数一般不会有中 文,如果有中文,则需要进行添加百分号转义。str = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];在http协议 中,没有明确的规定get的长度。不过根据浏览器不同,一般都在2-8k之间。
1 - (void)get{ 2 3 NSString *str = @"http://127.0.0.1/login.php?username=zhangsan&password=zhang"; 4 5 str = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 6 7 NSURL *url = [NSURL URLWithString:str]; 8 9 10 NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:1 timeoutInterval:10.0]; 11 12 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 13 14 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL]; 15 16 NSLog(@"%@",dict); 17 18 }]; 19 20 }
(二)post:
post多为向服务器发送一些重要数据,效率不如get,并且无法被缓存。例如提交加密后的账号密码或者一些其他数据。提交数据的大小依照服务器的规则。 post的参数是单独由一个请求体包裹着。发送到服务器后服务器根据请求体来选择传递的数据(请求体是二进制数据)。
1 - (void)post{ 2 3 NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/login.php"]; 4 5 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:1 timeoutInterval:10.0]; 6 request.HTTPMethod = @"post"; 7 request.HTTPBody = [@"username=zhangsan&password=zhang" dataUsingEncoding:NSUTF8StringEncoding]; 8 9 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 10 11 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL]; 12 13 NSLog(@"%@",dict); 14 15 }]; 16 17 }
(三)百度进行一次请求:
粘贴地址后发现是这样的-->
https://www.baidu.com/s?wd=%E6%88%91%E7%9A%84%20%E4%B8%96%E7%95%8C
这是因为get方法自己是ASC的,对中文进行转义了。其中20%就是一个特殊的空格转义字符。
然后监视下这一次百度的请求。
在响应头中-->
这个tyoe就是遵守的编码和一些规则。
在请求头中-->
user-agent显示着当前接收的设备,编号。如果改成手机端,那么百度则显示的是m百度的手机样式。
(四)服务器发送post请求
可以看到解析是json,编码是utf-8,接收设备是mac OS
并且此时还有一个请求体,请求体搭载着传输给服务器端的数据(这个数据通常是要加密的)
在json中还能看到解析结果:(json对应的键值对)
由此可见,网络数据通常可以通过抓取的方式得到一些头尾信息,然后通过oc代码来实现。