如何filter拦截所有请求iOS所有网络请求

IOS开发-网络请求方式总结
上层网络开发:基于http(超文本传输协议),而http是基于tcp/ip协议的。
开发简单、高效、数据量大。
http请求格式:
1:格式中的首部header:使用服务器时的附加说明信息
2:格式中的主体body:可以添加很多数据(可有可无)
http协议申明了客户端与服务端交互的方式,即请求方式:
get、post、put、delete
这四种方式可以对网络资源(url描述的内容)进行:查、改、增、删
常用的是下面两种:
1:get方法:下行/从服务端获得数据
&&&(1)get请求一般只是从服务器获得数据,请求时一般会提交服务器一些请求参数,附加在url上的,参数之间以&分割。
&&&&(2)url中英文和数字原样识别,而中文或者一些其他字符需要编码。
&&&&(3)get请求提交的数据一般放在http协议的头header中
2:post方法:上传/上传数据改变服务端内容
1)post请求多用于给服务器提交数据。
&&&&&(2)post请求提交的数据一般放在http的主体数据包body中
3:二者的区别:
&&&&&数据量的限制不同:
&&&&&&(1)由于get请求提交的数据是依附于url中,http协议没规定url长度及请求参数个数,所以理论上不存在大小限制,但是不同浏览器支持的url最大长度有所限制。
&&&&&&(2)http协议也没有规定post请求的大小,所以理论上post的大小也没有限制。但是往往服务端考虑到处理数据的能力,会对它做一些限制。但是一般post请求的数据量都会大于get请求。
&&&&&&安全性不同:
&&&&&&&(1)由于get请求的数据附加在url上,所以提交的数据是可以看见的,数据包被拦截后也是明文的,再者浏览器的浏览历史记录也会被人看见,加入提交的是用户名和密码那就很不安全。
&&&&&&&(2)post提交的数据是在body体中,相对安全性更高一些。
注意:(1)我们之前的网络音频、视频、webView学习中,用到的请求方式是什么?
&&&&&&&&&&&&&&&&&&&&&&iOS中不指定请求方式,默认都是get的,有对应的接口进行方式的设定。
&&&&&&&&&&&(2)什么时候使用get、什么时候使用post?
&&&&&&&&&&&&&&&&&&&&&在服务端没有特殊指定请求方式的情况下,可以用get、也可以用post;服务端指定某个数据只能通过post的方式,那就必须用post(一般要给服务端上传较大数据时都会指定用post)
&&&&&&&&&&&&(3)请求时要给服务端上传什么参数,提交什么数据?
&&&&&&&&&&&&&&&&&&&&&&&服务端让给什么就给什么!(开发中会有对应的接口文档)&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
webview里的js脚本进行ajax请求url,ios是否能对其拦截。并且返回給它json内容
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
Ajax 不会被拦截。可以考虑采用 iframe 方式,可以拦截。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
shouldStartLoadWithRequest 可以拦截。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
当然不能被拦截。你可以让js获取接口数据成功之后将数据采用添加iFrame的方式传到客户端。
同步到新浪微博
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:iOS上的http请求:get、post以及同步、异步
网上有个公开的天气接口:天气 ,点进其中的getSupportCityDataset接口,用这个接口为例写一下iOS上的HTTP请求的写法。 这里面提供了get、post请求的格式要求。
NSString * URLString = @".cn/WebServices/WeatherWS.asmx/getSupportCityDataset?theRegionCode=广东";
NSURL * URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSURLRequest * request = [[NSURLRequest alloc]initWithURL:URL];
NSURLResponse * response =
NSError * error =
NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (error) {
NSLog(@"error: %@",[error localizedDescription]);
NSLog(@"response : %@",response);
NSLog(@"backData : %@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
get方法的请求参数是放在长长的URL字符串里面,这里只需要一个参数,就是地区的编号或名字,通过这个参数,服务器返回属于这个区域内支持天气查找的城市列表。如果有更多的参数也是放在URL字符串里面,至于参数的组织方式,就看服务器的要求了。
用字符串构建NSURL,最好在使用URLWithString的时候把原字符串进行一下UTF8转码,关于为何要转码,看下这里第一部分。然后NSURL对象构建NSURLRequest,使用NSURLConnection的同步方法,传入request对象就可以通过get方法获取数据。
这里有个NSError对象地址传入,用于做错误判断,网络的实际情况是多变的,必须要考虑请求错误的情况,否则可能导致程序奔溃。
NSString * URLString = @".cn/WebServices/WeatherWS.asmx/getSupportCityString";
NSURL * URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSString * postString = @"theRegionCode=广东";
NSData * postData = [postString dataUsingEncoding:NSUTF8StringEncoding];
//将请求参数字符串转成NSData类型
NSMutableURLRequest * request = [[NSMutableURLRequest alloc]init];
[request setHTTPMethod:@"post"]; //指定请求方式
[request setURL:URL]; //设置请求的地址
[request setHTTPBody:postData];
//设置请求的参数
NSURLResponse *
NSData * backData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (error) {
NSLog(@"error : %@",[error localizedDescription]);
NSLog(@"response : %@",response);
NSLog(@"backData : %@",[[NSString alloc]initWithData:backData encoding:NSUTF8StringEncoding]);
post方式的时候参数是放在HTTPBody里面的,而且需要将字符串转码成响应的NSData类型,在接口文档里一般都有指出转码方式,需要按指定方式转码,这里的UTF8,也有gb2312的。request构建好了之后,和get方法一样使用NSURLConnection请求数据。
3、同步和异步请求:
一般网络请求都需要一段时间,哪怕数据再少、网络再好,都会有一段时间,而且很多时候必须考虑在网络不好的时候的app状态。使用同步请求只需安心等待数据就可以,不需要做额外操作,上面两例都是同步请求,connection调用方法后会把返回请求的数据,无需做什么其他事。但是同步会阻塞线程,如果通过点击button来发起请求,那么按钮会停留在highLight状态直到请求结束,会造成一种app卡住、死机的感觉,很不好。
NSString * URLString = @".cn/WebServices/WeatherWS.asmx/getSupportCityDataset?theRegionCode=广东";
NSURL * URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSURLRequest * request = [[NSURLRequest alloc]initWithURL:URL];
_connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
异步post类似,不再是使用NSURLConnection调用方法直接得到数据,而是使用(1)位置方法构建一个NSURLConnection对象,这个方法会默认开始请求数据。接下来关键就是靠委托了。因为请求的时间未知,所以使用委托模式的回调作用,在数据回来是调用协议方法。post和get委托方法处理一样。
协议方法:
要注意的是这里有两个委托:NSURLConnectionDataDelegate和NSURLConnectionDelegate,前一个继承于后一个,获取数据的方法是定义在前一个委托里面的,所以只要遵循NSURLConnectionDataDelegate就可以了。
一般用到四个委托方法:
//接受到respone,这里面包含了HTTP请求状态码和数据头信息,包括数据长度、编码格式等
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ NSLog(@"response = %@",response); _backData = [[NSMutableData alloc]init];
//接受到数据时调用,完整的数据可能拆分为多个包发送,每次接受到数据片段都会调用这个方法,所以需要一个全局的NSData对象,用来把每次的数据拼接在一起
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
[_backData appendData:data];
//数据接受结束时调用这个方法,这时的数据就是获得的完整数据了,可以使用数据做之后的处理了
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSLog(@"%@",[[NSString alloc]initWithData:_backData encoding:NSUTF8StringEncoding]);
//这是请求出错是调用,错误处理不可忽视
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
if (error.code == NSURLErrorTimedOut) {
NSLog(@"请求超时");
NSLog(@"%@",[error localizedDescription]);
最后,请求可以设置超时时间:NSURLRequest * request = [[NSURLRequest alloc]initWithURL:URL cachePolicy:0 timeoutInterval:8.0];或者:NSMutableURLRequest * request = [[NSMutableURLRequest alloc]initWithURL:URL];
[request setTimeoutInterval:8.0];请求时间超过所设置的超时时间,会自动调用-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error但是有个问题是怎么把判断是超时导致的请求失败,上面的例子里已经写了,可以根据返回的error的code进行判断。了解不同情况的请求失败,可以更好的给用户提示。1561人阅读
使用Charles拦截JSON数据
& & Charles是一款抓包修改工具,相比起burp,charles具有界面简单直观,易于上手,数据请求控制容易,修改简单,抓取数据的开始暂停方便等等优势!下面来详细介绍下这款强大好用的抓包工具。
如果你需要抓取一些JSON进行练手的话,使用Charles是个不错的选择
操刀对象:某XX下载APP
& & 1.Charles(破解版)
& & 2.iPhone
& & 3.MAC环境
& & 4.某款APP
一:开启wifi互联网共享
二:设置手机ip地址
设置完IP和端口点击返回就ok了,它会自动重新连接。
三:安装并启动软件
启动完毕,它默认是启动监听状态了,这个时候设备可以启动访问你想要抓取JSON的APP了
启动APP并且刷新数据后,可以看到已经拦截到数据了。
熟悉的JSON数据,接下来对它进行在线解析就行了
下面直接就可以访问该URL并且解析服务返回的JSON数据达到我们的目的了。
/v2/ios/c02/homepage?p=1&timestamp=&sign=4afa7a414e&devicetype=1&systemversion=9.0.2&deviceimei=2CE838A3-D6CA-423E-AC08-03F31A9159CB&jailbreak=2&clienttype=1&clientversion=4.1.0&channel=500389&identity=33&nettype=WiFi&lang=zh-Hans-CN&sn=2CE838A3-D6CA-423E-AC08-03F31A9159CB&idfa=2CE838A3-D6CA-423E-AC08-03F31A9159CB&certId=33&idfv=AEFFBDE7-FDCC-479C-898F-919EA9820D4B&uuid=EEB6E4FF-A3C3-4ECF-ADC2-B6412AFB1453&showModel=iphone_4&isauthor=2&uid=-1&ipatype=1&device_uuid=Unknow&appleid=&clientip=&hlaccount=
- (void)viewDidLoad {
// URL资源
NSURL* URL = [NSURL URLWithString:@&/v2/ios/c02/homepage?p=1×tamp=&sign=4afa7a414e&devicetype=1&systemversion=9.0.2&deviceimei=2CE838A3-D6CA-423E-AC08-03F31A9159CB&jailbreak=2&clienttype=1&clientversion=4.1.0&channel=500389&identity=33&nettype=WiFi&lang=zh-Hans-CN&sn=2CE838A3-D6CA-423E-AC08-03F31A9159CB&idfa=2CE838A3-D6CA-423E-AC08-03F31A9159CB&certId=33&idfv=AEFFBDE7-FDCC-479C-898F-919EA9820D4B&uuid=EEB6E4FF-A3C3-4ECF-ADC2-B6412AFB1453&showModel=iphone_4&isauthor=2&uid=-1&ipatype=1&device_uuid=Unknow&appleid=&clientip=&hlaccount=&];
//创建任务
NSURLSession* session = [NSURLSession sharedSession];
NSURLRequest* request = [NSURLRequest requestWithURL:URL];
// 解析任务
NSURLSessionDataTask* task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (data==nil||error)
NSLog(@&访问有误&);
//解析Json
NSDictionary* dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
// 手动解析
NSDictionary* datas = dic[@&data&];
NSArray* banner = datas[@&banner&];
NSString* titles = banner[0][@&img&];
NSLog(@&标题%@&,titles);
// 图片下载
NSURL* downUrl = [NSURL URLWithString:titles];
NSData* ImageData = [NSData dataWithContentsOfURL:downUrl];
// 返回主线程刷新
dispatch_async(dispatch_get_main_queue(), ^{
if (ImageData)
self.IMAGES.image = [UIImage imageWithData:ImageData];
[task resume];
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:13496次
排名:千里之外
原创:30篇
(1)(7)(25)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'

我要回帖

更多关于 spring 拦截所有请求 的文章

 

随机推荐