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

人魔七七: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结构的更多相关文章

  1. [深入浅出Cocoa]iOS网络编程之Socket

    http://blog.csdn.net/kesalin/article/details/8798039 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   [深入浅出Co ...

  2. 【读书笔记】iOS网络-同步请求,队列式异步请求,异步请求的区别

    一,同步请求的最佳实践. 1,只在后台过程中使用同步请求,除非确定访问的是本地文件资源,否则请不要在主线程上使用. 2,只有在知道返回的数据不会超出应用的内存时才使用同步请求.记住,整个响应体都会位于 ...

  3. 【读书笔记】iOS网络-优化请求性能

    一,度量网络性能 1,网络带宽 用于描述无线网络性能的最常见度量指标就是带宽.在数字无线通信中,网络带宽可以描述为两个端点之间的通信通道每秒钟可以传输的位数.现代无线网络所能提供的理论带宽是很高的.不 ...

  4. 【读书笔记】iOS网络-异步请求与运行循环

    异步请求需要运行循环.当数据传递到服务器或是被客户端接收时,运行循环用于实现事件与委托对象之间的通信.异步请求在发出时,会在当前线程的运行循环上操作,这个实现细节是很重要的,因为在GCD块中或者是通过 ...

  5. ios网络 -- HTTP请求 and 文件下载/断点下载

    一:请求 http://www.jianshu.com/p/8a90aa6bad6b 二:下载 iOS网络--『文件下载.断点下载』的实现(一):NSURLConnection http://www. ...

  6. IOS网络同步请求

    //1.目标地址 NSString *url_string = @"http://b33.photo.store.qq.com/psu?/05ded9dc-1001-4be2-b975-13 ...

  7. Java网络编程之InetAddress和URL

    在Java中提供了专门的网络开发程序包---java.net,java的网络编程提供了两种通信协议:TCP(传输控制协议)和UDP(数据报协议). 一.IP(Internet Protocol) 与I ...

  8. Java:网络编程之IP、URL

    java.net  类 InetAddress 此类表示互联网协议 (IP) 地址. 会抛出异常 UnknownHostException   直接已知子类:         Inet4Address ...

  9. iOS - NetRequest 网络数据请求

    1.网络请求 1.1 网络通讯三要素 1.IP 地址(主机名): 网络中设备的唯一标示.不易记忆,可以用主机名(域名). 1) IP V4: 0~255.0~255.0~255.0~255 ,共有 2 ...

随机推荐

  1. [原]运行编译好的Android模拟器

    Android源码编译好了之后,我们就可以运行它了. 1.配置环境变量: /data/data/Android$ export PATH=$PATH:$(pwd)/out/host/linux-x86 ...

  2. MVC3.0学习笔记之元模型元数据ModelMetaData以及模型元数据提供系统

    模型元数据ModelMetaData是MVC中很重要的概念,它包括但不仅限于 模型的类型,模型包含了哪些属性,属性都是什么类型的,属性上都有什么特性. ASP.NET MVC3.0 提供了默认的模型元 ...

  3. SQL:一句话删除重复的数据

    --构造原始数据 )) --插入数据 INSERT INTO #T (N)VALUES ('A') --方式一:一句话删除重复数据(无主键) --方式二:采用CTQ,with的写法删除 ;

  4. android 代码控制控件的长宽,小技巧

    要在代码里改变ImageView 的长宽,如图 通过拿到contentImage这对象的控件参数,再去改变,再设置 , 上图的contentImage为ImageView对象: 而这里 要提醒的是,L ...

  5. [Node.js] Node + Redis 实现分布式Session方案

    原文地址: http://www.moye.me/?p=565 Session是什么? Session 是面向连接的状态信息,是对 Http 无状态协议的补充. Session 怎么工作? Sessi ...

  6. 值得拥有!精心推荐几款超实用的 CSS 开发工具

    当你开发一个网站或 Web 应用程序的时候,有合适的工具,绝对可以帮助您节省大量的时间.在这篇文章中,我为大家收集了超有用的 CSS 开发工具. 对于 Web 开发人员来说,找到有用的 CSS 开发工 ...

  7. UITextField-secureTextEntry

    1.UITextFiled的密文输入   secureTextEntry  安全文本输入  secure:安全  Entry:入口

  8. iOS-布局-Masonry

    一.说明:demo中的举例视图介绍  UIView        *_blackView;     作为父视图  UIView        *_redView;       与父视图内边距为10   ...

  9. 一个android应用开发的感悟

    对于客户端的开发,以我个人现在的水准,很难进行一个系统的讲解,只能分享下遇到的几个问题点好了! 1:对于tabhost的使用,这个东西真的是过时了:第一个版本,我是用的tabhost确实是很难用,不过 ...

  10. C#函数式程序设计之用闭包封装数据

    如果一个程序设计语言能够用高阶函数解决问题,则意味着数据作用域问题已十分突出.当函数可以当成参数和返回值在函数之间进行传递时,编译器利用闭包扩展变量的作用域,以保证随时能得到所需要的数据. C#函数式 ...