Objective-c语言_计算机网络和URL(代码1)

来源:互联网 发布:爱钱进可靠吗 知乎 编辑:程序博客网 时间:2024/06/01 21:46

计算机网络和url(代码)


NSURL url用于标识internet上资源位置。它指定用于访问服务器的协议,服务器名称以及文件在服务器上面的位置。

如: http://3.chihuoyizu.sinaapp.com

例子:protocol://username@hostname:port/path/filename?query#fragment

语法:     1.protocol:代表网络协议,可以http、FTP、file等协议 2.username:代表服务器用户名,可选参数 3.hostname:代表服务器名称,可以是名称,也可以是'节点地址' 4.port:代表端口号,可选参数,如果是http协议,会默认端口为80端口,如果是FTP协议,默认是21端口 5.path/filename:代表文件在服务器路径 6.query#fragment:代表查询条件,通常用于向服务器提供附加参数一般只用于http URL,这里的查询条件是向服务器程序提供参数

note:

在URL中不可以出现中文、空格、百分号等一些特殊字符串。因此我们需要对此URL进行编码。

为什么要对url进行编码

我们都知道HTTP协议中参数的传输是"key=value"这种键值对形式的,如果要传多个参数就需要用"&"符号对键值对进行分割,如"?name1=value1&name2=value2",这样在服务端收到这种字符串的时候,就会用"&"分割出每一个参数,然后再用"="来分割出参数值

针对"name1=value1&name2=value2"我们来说一下客户端到服务器端的概念上解析过程: 上述字符串在计算机中用ASCII码表示为: 6E616D6531 3D 76616C756531 26 6E616D6532 3D 76616C756532。 6E616D6531:name1 3D:= 76616C756531:value1 26:& 6E616D6532:name2 3D:= 76616C756532:value2

服务端在接收到该数据后就可以遍历该字节流,首先一个一个字节的吃,当吃到3D这个字节后,服务端就知道前面吃的字节表示一个key,再向后吃,如果遇到26字节之间的是上一个key的value,以此类推就可以解析出客户端传过来的参数。

现在有这样一个问题,如果参数中就包含=或者&这中特殊字符的时候该怎么办。 比如说"name1=value1",其中"value1"的值是"va&lu=e1"。我们的本意就是只有一个键值对,但是服务端会解析成两个键值对,这样会产生歧义。 如何解决上述问题带来的歧义呢?解决的办法就是对参数进行url编码。

URL编码只是简单的在特殊字符的各个字节前面加上%。例如,我们对上述会产生歧义的字符进行url编码后结果"va%26lu%3De1",这样服务端会把紧跟在%号后字节当成普通的字节,就不会把它当成各个参数或键值对的分割符


在运行时记得前面我得说过的ios9网络适配不然会错的哦:

//    char *dd = "name1=value1&name2=value2";

//    NSData *data = [NSData dataWithBytes:dd length:strlen(dd)];

//    NSLog(@"data = %@",data);

    

    NSString *urlString = @"http://b.hiphotos.baidu.com/image/pic/item/ac4bd11373f082021bd203054cfbfbedab641b43.jpg";

    

    //url字符串进行编码

    urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

    

    //url字符串转成NSURL

    NSURL *url = [NSURL URLWithString:urlString];

    

//    NSData接收从服务器传过来的数据

//    NSData *data = [NSData dataWithContentsOfURL:url];

    

//    NSLog(@"data = %@",data);

    

    //OC中将URL字符串转换成NSURL,其协议、主机域名、路径文件、查询条件都被封装成NSURL类的属性

    

    //转码后的urlString

    NSLog(@"url.absoluteString = %@",url.absoluteString);

    

    //协议

    NSLog(@"url.scheme = %@",url.scheme);

    //资源路径

    NSLog(@"url.resourceSpecifier = %@",url.resourceSpecifier);

    //获取域名

    NSLog(@",url.host = %@",url.host);

    //协议获取端口号

    NSLog(@"url.port = %@",url.port);

    //获取用户名

    NSLog(@"url.user = %@",url.user);

    //获取密码

    NSLog(@"url.password = %@",url.password);

运行结果:


0 0