IOS网络编请求响应之URL结构

简介: 资料均来自互联网,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 人魔七七:http://www.cnblogs.com/qiqibo/ 对于我们IOS开发者来说,我们最重要的是访问网络的资源,数据都是服务器提供给我们的。

资料均来自互联网,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。

人魔七七:http://www.cnblogs.com/qiqibo/

对于我们IOS开发者来说,我们最重要的是访问网络的资源,数据都是服务器提供给我们的。我们一般会通过API访问我们网络资源,一般一个资源可能对应很多URL,但是一个URL只对应一个资源不能对应很多资源。但是也有一些例外,例如当hostName引用一个模糊的主机。在URL加载IOS系统中,NSURL对象被用来管理URL对象。

一个URL通常由下面几个部分组成如下图:

Image

protocol:这个协议组成部分指定应用层协议来和服务器通信。你可能了解有其他的协议比如ftp协议相对于http协议。http协议的统治地位因为pre-http协议遭到挑战。另一个经常用的协议是file协议,file协议是IOS的app用来在沙盒检索数据的协议。如果你用NSURL但是没有用到其他的协议,默认用的就是这个协议。

Credentials:Credentials:一些http服务器支持用户凭证的URL对基本身份验证是一个挑战。如上图所示这个凭证组成部分包含了用户名密码的身份验证,这种格式索然不是很普遍,考虑比其他方式验证更不安全。

Hostname:这个组件包含TCP的hostname和IP地址关于主机包含它想要的资源。如果URL的协议是file那么应该省略这些东西。一个URL针对一个独立的资源被打破这是个例外当相对的和本地的主机名字被使用。例如你的主机名字作为hostname,这个URL关联本地机器然后用同一个URL可以关联不同的资源在不同的机器上。

Port:这个URL port部分指定这个客户端应该连接哪个端口。如果忽略了,那么客户端将要用默认的端口为这个协议例如http的80端口,https的443端口。最好的实践是用这些端口值当应用运行在外网因为有些网络代理和防火墙将阻塞非标准端口值因为安全或者隐私的原因。

Absolute-path:这个绝对路径部分指定网络资源的路径,如果http服务器有可能有目录树。这个绝对路径可能包括任意数量的路径组件每个组件用"/"字符分隔。一个绝对路径可能不包含一个问号,空格,回车,或者换行符字符。有一些Rest服务用路径部分作为传递值来独特标识一个实体存储到数据库的一种手段。例如,一个路径/customer/456/address/0将要指定标识符456索引在0的地址。

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
 
相关文章
|
13天前
|
Java 程序员
JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
37 9
|
3月前
|
机器学习/深度学习 资源调度 自然语言处理
不同类型的循环神经网络结构
【8月更文挑战第16天】
48 0
|
13天前
|
Java 开发者
JAVA高手必备:URL与URLConnection,解锁网络资源的终极秘籍!
在Java网络编程中,URL和URLConnection是两大关键技术,能够帮助开发者轻松处理网络资源。本文通过两个案例,深入解析了如何使用URL和URLConnection从网站抓取数据和发送POST请求上传数据,助力你成为真正的JAVA高手。
31 11
|
9天前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
17天前
|
机器学习/深度学习 计算机视觉 网络架构
【YOLO11改进 - C3k2融合】C3k2融合YOLO-MS的MSBlock : 分层特征融合策略,轻量化网络结构
【YOLO11改进 - C3k2融合】C3k2融合YOLO-MS的MSBlock : 分层特征融合策略,轻量化网络结构
|
3月前
|
安全 网络安全 Android开发
安卓与iOS开发:选择的艺术网络安全与信息安全:漏洞、加密与意识的交织
【8月更文挑战第20天】在数字时代,安卓和iOS两大平台如同两座巍峨的山峰,分别占据着移动互联网的半壁江山。它们各自拥有独特的魅力和优势,吸引着无数开发者投身其中。本文将探讨这两个平台的特点、优势以及它们在移动应用开发中的地位,帮助读者更好地理解这两个平台的差异,并为那些正在面临选择的开发者提供一些启示。
126 56
|
25天前
|
机器学习/深度学习 算法
神经网络的结构与功能
神经网络是一种广泛应用于机器学习和深度学习的模型,旨在模拟人类大脑的信息处理方式。它们由多层不同类型的节点或“神经元”组成,每层都有特定的功能和责任。
27 0
|
2月前
|
iOS开发
url中带中文,ios报错问题
url中带中文,ios报错问题
|
2月前
|
编解码 人工智能 文件存储
卷积神经网络架构:EfficientNet结构的特点
EfficientNet是一种高效的卷积神经网络架构,它通过系统化的方法来提升模型的性能和效率。
53 1
|
3月前
|
安全 Java 网络安全
【认知革命】JAVA网络编程新视角:重新定义URL与URLConnection,让网络资源触手可及!
【认知革命】JAVA网络编程新视角:重新定义URL与URLConnection,让网络资源触手可及!
43 2
下一篇
无影云桌面