IOS网络编请求响应之URL结构
资料均来自互联网,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。
人魔七七: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对基本身份验证是一个挑战。如上图所示这个凭证组成部分包含了用户名密码的身份验证,这种格式索然不是很普遍,考虑比其他方式验证更不安全。
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 = ;
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 ==) {
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
IOS网络编请求响应之URL结构的更多相关文章
- [深入浅出Cocoa]iOS网络编程之Socket
http://blog.csdn.net/kesalin/article/details/8798039 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] [深入浅出Co ...
- 【读书笔记】iOS网络-同步请求,队列式异步请求,异步请求的区别
一,同步请求的最佳实践. 1,只在后台过程中使用同步请求,除非确定访问的是本地文件资源,否则请不要在主线程上使用. 2,只有在知道返回的数据不会超出应用的内存时才使用同步请求.记住,整个响应体都会位于 ...
- 【读书笔记】iOS网络-优化请求性能
一,度量网络性能 1,网络带宽 用于描述无线网络性能的最常见度量指标就是带宽.在数字无线通信中,网络带宽可以描述为两个端点之间的通信通道每秒钟可以传输的位数.现代无线网络所能提供的理论带宽是很高的.不 ...
- 【读书笔记】iOS网络-异步请求与运行循环
异步请求需要运行循环.当数据传递到服务器或是被客户端接收时,运行循环用于实现事件与委托对象之间的通信.异步请求在发出时,会在当前线程的运行循环上操作,这个实现细节是很重要的,因为在GCD块中或者是通过 ...
- ios网络 -- HTTP请求 and 文件下载/断点下载
一:请求 http://www.jianshu.com/p/8a90aa6bad6b 二:下载 iOS网络--『文件下载.断点下载』的实现(一):NSURLConnection http://www. ...
- IOS网络同步请求
//1.目标地址 NSString *url_string = @"http://b33.photo.store.qq.com/psu?/05ded9dc-1001-4be2-b975-13 ...
- Java网络编程之InetAddress和URL
在Java中提供了专门的网络开发程序包---java.net,java的网络编程提供了两种通信协议:TCP(传输控制协议)和UDP(数据报协议). 一.IP(Internet Protocol) 与I ...
- Java:网络编程之IP、URL
java.net 类 InetAddress 此类表示互联网协议 (IP) 地址. 会抛出异常 UnknownHostException 直接已知子类: Inet4Address ...
- iOS - NetRequest 网络数据请求
1.网络请求 1.1 网络通讯三要素 1.IP 地址(主机名): 网络中设备的唯一标示.不易记忆,可以用主机名(域名). 1) IP V4: 0~255.0~255.0~255.0~255 ,共有 2 ...
随机推荐
- Groovy split竖杆注意
前几天将09年写的一个Asp程序使用Grails改造重写,在处理手机号码Split的时候,Asp代码: dim phoneArr phoneArr = split(phones,"|&quo ...
- Windows Phone 8.1 Update1 支持中文“小娜”及开发者模拟器更新
千呼万唤的 Windows Phone 8.1 Update1 在 developer Perview 发布了还没有升级的朋友随我先睹为快吧.升级了的朋友们来看看 WP8.1 update1 还有哪些 ...
- java之final关键字
final关键字(可以读不可以写.只读) 1.final的变量的值不能够被改变 ①.final的成员变量 ②.final的局部变量(形参) //意思是“实参”一旦传进我的方法里面,就不允许改变 2.f ...
- Python 中的进程、线程、协程、同步、异步、回调
进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生? 一.上下文切换技术 简述 在进一步之前,让我们先回顾一下各种上下文切换技术. 不过首先说 ...
- MFC的消息管理
一般而言,与视图状态和用户输入有关的命令由视图类来处理,与文件操作有关的命令由文档类来处理,与窗口布局有关的命令由主框架类来处理,与程序的运行状态有关的命令由APP类来处理.
- Git使用日记
git是个分布式的版本管理工具,现在我们前端这边用它做版本管理.之前也看过一些相关资料,不过没有使用它管理过项目代码.如今,用它也有段时间了所以就写些东西,仅供参考. ###快速上手 工作经常用到的几 ...
- UnWind Segue
iOS 6 和 Xcode 4.5 中添加了一个新特性叫做“Unwind Segue”. 使用Unwind Segue,可以方便的在Navigation Controller的Controllers之 ...
- NGUI之UIRoot屏幕分辨率自适应
NGUI在Unity3D游戏开发中非常常用,而NGUI对于每一个UI场景,都是以一个UIRoot为UI游戏对象树的根的,那么这个UIRoot是起什么作用的呢? 先简单看一下UIRoot中的基本属性 U ...
- 浅析.NET泛型
泛型是.NET Framework 2.0最强大的功能,通过泛型可以定义类型安全的数据结构,而没有必要使用实际的数据类型,这将显著提高性能并得到更高质量的代码.在.NET Framework 2.0之 ...
- kubernetes学习笔记
docker实现了更便捷的单机容器虚拟化的管理, docker的位置处于操作系统层与应用层之间; 相对传统虚拟化(KVM,XEN): docker可以更加灵活的去实现一些应用层功能, 同时对资源的利用 ...