资料均来自互联网,转载时请务必以超连接形式标明文章 原始出处 、做者信息和本声明。不然将追究法律责任。html
人魔七七:http://www.cnblogs.com/qiqibo/数据库
对于咱们IOS开发者来讲,咱们最重要的是访问网络的资源,数据都是服务器提供给咱们的。咱们通常会经过API访问咱们网络资源,通常一个资源可能对应不少URL,可是一个URL只对应一个资源不能对应不少资源。可是也有一些例外,例如当hostName引用一个模糊的主机。在URL加载IOS系统中,NSURL对象被用来管理URL对象。安全
一个URL一般由下面几个部分组成以下图:服务器
protocol:这个协议组成部分指定应用层协议来和服务器通讯。你可能了解有其余的协议好比ftp协议相对于http协议。http协议的统治地位由于pre-http协议遭到挑战。另外一个常常用的协议是file协议,file协议是IOS的app用来在沙盒检索数据的协议。若是你用NSURL可是没有用到其余的协议,默认用的就是这个协议。网络
Credentials:Credentials:一些http服务器支持用户凭证的URL对基自己份验证是一个挑战。如上图所示这个凭证组成部分包含了用户名密码的身份验证,这种格式索然不是很广泛,考虑比其余方式验证更不安全。app
Hostname:这个组件包含TCP的hostname和IP地址关于主机包含它想要的资源。若是URL的协议是file那么应该省略这些东西。一个URL针对一个独立的资源被打破这是个例外当相对的和本地的主机名字被使用。例如你的主机名字做为hostname,这个URL关联本地机器而后用同一个URL能够关联不一样的资源在不一样的机器上。编码
Port:这个URL port部分指定这个客户端应该链接哪一个端口。若是忽略了,那么客户端将要用默认的端口为这个协议例如http的80端口,https的443端口。最好的实践是用这些端口值当应用运行在外网由于有些网络代理和防火墙将阻塞非标准端口值由于安全或者隐私的缘由。url
Absolute-path:这个绝对路径部分指定网络资源的路径,若是http服务器有可能有目录树。这个绝对路径可能包括任意数量的路径组件每一个组件用"/"字符分隔。一个绝对路径可能不包含一个问号,空格,回车,或者换行符字符。有一些Rest服务用路径部分做为传递值来独特标识一个实体存储到数据库的一种手段。例如,一个路径/customer/456/address/0将要指定标识符456索引在0的地址。spa
Query:URl的最后部分是查询字符串。这个值是从绝对路径用?隔开的。多个参数每一个参数用&分隔。查询字符串不能包含回车空格换行字符。代理
由于决定路径和拼接的查询字符串的内容是有限制的。URL一般用百分比编码。rfc 3986指定了URL百分比编码的具体细节IOS提供一个字符串对象的方法来执行URL编码。下面代码片断显示如何编码。
NSString *urlString = @"http://myhost.com?query=This is a question"; NSString *encoded = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
这个编码的结果是:http://myhost.com?query=This%20is%20a%20question.每一个空格被替换成%20序列。这个编码和URL编码不同之处在于不编码&字符。从而使URL参数无缺无损。URL编码将要编码&符号,问号,和其余标点符号。若是你查询字符串包含这些字符串。你须要实现更完全的编码方法。目的是把这些字符转化为%+ASCII这种模式代替。
你能够专门把这些符号剔除出来。
因而网上找了一个解决方案(
(@ http://www.cnblogs.com/meyers/archive/2012/04/26/2471669.html)
)
@implementation NSURL (mm) + (NSURL *)URLWithBaseString:(NSString *)baseString parameters:(NSDictionary *)parameters{ NSMutableString *urlString =[NSMutableString string]; //The URL starts with the base string[urlString appendString:baseString]; [urlString appendString:baseString]; NSString *escapedString; NSInteger keyIndex = 0; for (id key in parameters) { //First Parameter needs to be prefixed with a ? and any other parameter needs to be prefixed with an & if(keyIndex ==0) { escapedString =(NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)[parameters valueForKey:key], NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8); [urlString appendFormat:@"?%@=%@",key,escapedString]; [escapedString release]; }else{ escapedString =(NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)[parameters valueForKey:key], NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8); [urlString appendFormat:@"&%@=%@",key,escapedString]; [escapedString release]; } keyIndex++; } return [NSURL URLWithString:urlString]; } @end
例如: NSString * baseString = @"http://twitter.com/statuses/update.xml";
NSDictionary*dictionary=[NSDictionary dictionaryWithObjectsAndKeys:@"This is my status",@"status",@"meng ya", @"meyers",nil]; NSURL * url = [NSURL URLWithBaseString:baseString parameters:dictionary]; NSLog(@"the url : %@", url);
输出:the url : http://twitter.com/statuses/update.xml?status=This%20is%20my%20status&meyers=meng%20ya