Lan*_*nce 10 iphone cocoa-touch objective-c
我正在我的iphone应用程序中执行HTTP Post,并且我发送到服务器的其中一个参数是URL.问题是,当我从NSURL转换为NSURLRequest时,字符串http://www.slashdot.org变为http:/www.slashdot.org(缺少正斜杠之一)
有没有解决的办法?
这是我正在使用的代码:
NSString *host = @"example.host.com";
NSString *urlString = [NSString stringWithFormat:@"/SetLeaderUrl.json?leader_email=%@&url=%@",localEmail,urlToPublish];
NSURL *url = [[NSURL alloc] initWithScheme:@"http" host:host path:urlString];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *jsonString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)
我已经使用NSLog来查看它丢失'/'的位置,它位于第四行:
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
Run Code Online (Sandbox Code Playgroud)
感谢您抽出宝贵时间阅读!
Dav*_*ong 12
在将查询值替换为字符串之前,您不会将查询值转换为百分比.我刚做了一点测试,发现如果我设置urlToPublish为" http://example.com ",那么NSURL会将其转换为"http:/example.com".
这是因为查询值包含特殊字符,这意味着您需要添加百分比转义.至少,你可以用平庸-[NSString stringByAddingPercentEscapesUsingEncoding:]用NSASCIIStringEncoding.更好的方法是使用不同的(并且更完整的)转义机制,例如我在本文中建议的那种.
在这种情况下,stringByAddingPercentEscapesUsingEncoding:不起作用,因为它是一个非常糟糕的方法.它适用于包容性模型,这意味着您必须告诉它您希望百分比编码的字符.(在引擎盖下,它只是调用CFURLCreateStringByAddingPercentEscapes())这个函数基本上要求你一个字符串,表示允许百分比编码的每个字符(据我理解的功能).你真正想要的是一个独家模型:除了[这一小部分字符]之外的一切.我上面链接的功能就是这样,你会像这样使用它:
NSString *urlToPublish = [@"http://stackoverflow.com" URLEscapedString_ch];
NSString *host = @"example.host.com";
NSString *urlString = [NSString stringWithFormat:@"/SetLeaderUrl.json?leader_email=%@&url=%@",localEmail,urlToPublish];
NSURL *url = [[NSURL alloc] initWithScheme:@"http" host:host path:urlString];
Run Code Online (Sandbox Code Playgroud)
然后它将正确构建您的URL.
这是你可以做到这一点的另一种方式(并正确地做到这一点).转到我的github页面并下载"DDURLBuilder.h"和"DDURLBuilder.m",然后像这样构建你的URL:
NSString *localEmail = @"foo@example.com";
NSString *urlToPublish = @"http://stackoverflow.com"
DDURLBuilder *b = [DDURLBuilder URLBuilderWithURL:nil];
[b setScheme:@"http"];
[b setHost:@"example.host.com"];
[b setPath:@"SetLeaderUrl.json"];
[b addQueryValue:localEmail forKey:@"leader_email"];
[b addQueryValue:urlToPublish forKey:@"url"];
NSURL *url = [b URL];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6835 次 |
| 最近记录: |