
@interface connectionWrapper : NSObject
@property(retain) NSURLRequest *request
@property(retain) NSURLConnection *connection
通过在一个可变数组保持这种数据结构,可以区分由连接迭代数组与每个connectionWrapper实例的-connection属性connection对的,如果它们匹配(指向一个对象),那么你就可以检索connectionWrapper实例的-request属性,那么-url NSURLRequest实例的属性。 因为我不是一个母语是英语 CodeGo.net,我认为代码是一个更好的导师。-(NSURLRequest*)getRequestByConnection:(NSURLConnection*)connection
{
for(connectionWrapper *w in theArrayContainingAllConnectionWrappers)
{
if(w == connection)
return w.request
}
}
在-(void)connection:(NSURLConnection*)connection didReceiveResponse(NSURLResponse*)response
{
NSURLRequest *request = [self getRequestByConnection:connection]
NSURL *url = [request url]
/*apply different approach to different url/*
}
PS:这是非常可悲的,NSURLConnection的没有-request属性,这样我们就可以检索与轻松连接关联的请求。
2. 这种或那种方式,你将不得不作出2个请求。即使你直接在Web浏览器中打开一个网页时,浏览器会在它下载的HTML引用的CSS文件中一个单独的请求。如果你的应用程序需要HTML和CSS文件,那么你要它做2个独立的URL请求,首先要获取HTML,然后让CSS文件。 现在,只需2个请求需要进行,那并不是你将永远需要编写,使那些2请求的代码。这可能是因为就像那些被@Slee库自动采取的优先个请求的结果,解析出来,并为所有引用的CSS文件的请求。我没有跟他们合作,所以我不知道他们支持,或者如果有图书馆为你做这个。 你可能要考虑的一件事是通过一个UIWebView在加载HTML和CSS,而不是手工处理这一切。 UIWebView中会尝试加载,解析和渲染HTML文件到在这个过程中它会加载引用的CSS和JavaScript文件,并把它们应用到它的渲染。如果你想要做什么特别喜欢拦截来电它使加载CSS文件(S),你可以在UIWebViewDelegate协议并设置了UIWebView中的代表。在该委托就可以了-webView:shouldStartLoadWithRequest:navigationType:
本地文件不可以url直接加参数,可以在uiwebview 加载好后 用js和oc 交互,传递参数。参考:
NSURL *urlNosmoke = [NSURL URLWithString:[NSString stringWithFormat:@"nosmokeProgram.html"]]
NSString *strFilePath = [self.viewController.commandDelegate pathForResource:[urlNosmoke path]]
NSURL *urlNonSmoking = [NSURL URLWithString:@"?nonSmokingId=2013" relativeToURL:[NSURL URLWithString:strFilePath]]
NSURLRequest *req = [[NSURLRequest alloc] initWithURL:urlNonSmoking
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:20.0f]
[self.viewController.webViewEngine loadRequest:req]
iOS开发网络篇—GET请求和POST请求一、GET请求和POST请求简单说明
创建GET请求
1 //1.设置请求路径
2 NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text]
3 NSURL *url=[NSURL URLWithString:urlStr]
4
5 //2.创建请求对象
6 NSURLRequest *request=[NSURLRequest requestWithURL:url]
7
8 //3.发送请求
服务器:
创建POST请求
1 // 1.设置请求路径
2 NSURL *URL=[NSURL URLWithString:@"http://192.168.1.53:8080/MJServer/login"]//不需要传递参数
3
4 //2.创建请求对象
5 NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:URL]//默认为get请求
6 request.timeoutInterval=5.0//设置请求超时为5秒
7 request.HTTPMethod=@"POST"//设置请求方法
8
9 //设置请求体
10 NSString *param=[NSString stringWithFormat:@"username=%@&pwd=%@",self.username.text,self.pwd.text]
11 //把拼接后的字符串转换为data,设置请求体
12 request.HTTPBody=[param dataUsingEncoding:NSUTF8StringEncoding]
13
14 //3.发送请求
服务器:
二、比较
建议:提交用户的隐私数据一定要使用POST请求
相对POST请求而言,GET请求的所有参数都直接暴露在URL中,请求的URL一般会记录在服务器的访问日志中,而服务器的访问日志是黑客攻击的重点对象之一
用户的隐私数据如登录密码,银行账号等。
三、使用
1.通过请求头告诉服务器,客户端的类型(可以通过修改,欺骗服务器)
1 // 1.设置请求路径
2 NSURL *URL=[NSURL URLWithString:@"http://192.168.1.53:8080/MJServer/login"]//不需要传递参数
3
4 //2.创建请求对象
5 NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:URL]//默认为get请求
6 request.timeoutInterval=5.0//设置请求超时为5秒
7 request.HTTPMethod=@"POST"//设置请求方法
8
9 //设置请求体
10 NSString *param=[NSString stringWithFormat:@"username=%@&pwd=%@",self.username.text,self.pwd.text]
11 //把拼接后的字符串转换为data,设置请求体
12 request.HTTPBody=[param dataUsingEncoding:NSUTF8StringEncoding]
13
14 //客户端类型,只能写英文
15 [request setValue:@"ios+android" forHTTPHeaderField:@"User-Agent"]
服务器:
2.加强对中文的处理
问题:URL不允许写中文
在GET请求中,相关代码段打断点以验证。
在字符串的拼接参数中,用户名使用“文顶顶”.
转换成URL之后整个变成了空值。
提示:URL里面不能包含中文。
解决:进行转码
1 //1.设置请求路径
2 NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text]
3//转码
4urlStr= [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
5 NSURL *url=[NSURL URLWithString:urlStr]
6
7 //2.创建请求对象
8 NSURLRequest *request=[NSURLRequest requestWithURL:url]
调试查看:
服务器:
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)