gpt4 book ai didi

iphone - 从 NSURL 转换为 NSURLRequest 时丢失 a/

转载 作者:太空狗 更新时间:2023-10-30 03:26:36 28 4
gpt4 key购买 nike

我正在我的 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];

我已经使用 NSLog 查看它丢失“/”的位置,它在第四行:

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];

感谢您花时间阅读!

最佳答案

在将查询值替换为字符串之前,您没有对查询值进行百分比转义。我刚刚做了一个小测试,发现如果我将 urlToPublish 设置为“http://example.com”,那么 NSURL 会将其转换为“http:/example.com”。

这是因为查询值包含特殊字符,这意味着您需要添加百分比转义。至少你可以使用普通的 -[NSString stringByAddingPercentEscapesUsingEncoding:]NSASCIIStringEncoding。更好的方法是使用不同的(并且更完整的)转义机制,例如我建议的转义机制 in this post .


在这种情况下,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];

然后它将正确构建您的 URL。


这是您可以执行此操作的另一种方法(并且正确地)。转到 my github page并下载“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];

关于iphone - 从 NSURL 转换为 NSURLRequest 时丢失 a/,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5412431/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com