为什么NSURLError仅限特定NSURL的-1000(错误的URL)?

时间:2012-09-21 19:47:58

标签: objective-c ios url nsurl instagram

我查看了我能找到的所有相关问题(搜索:“NSURLErrorDomain -1000”),但找不到解决方案。也许有些老鹰眼的人可以帮助我。

我正在从iOS 6拨打Instagram API(但有效的部分,已经在iOS 5.1中这样做了)。我正在使用Koolistov的NSURL+PathParameters.h作为帮助者,我的理解是它确实逃脱了URL中所需的一切。

一些预赛:

NSDictionary *parameters = nil;
NSURL *URL = [NSURL URLWithString:@"https://api.instagram.com/"];
parameters = [NSDictionary dictionaryWithObjectsAndKeys:
    INSTAGRAM_CLIENT_ID, @"client_id", nil];
URL = [URL URLByReplacingPathWithPath:@"/v1/tags/awesome/media/recent"];
URL = [URL URLByAppendingParameters:parameters];

INSTAGRAM_CLIENT_ID是一个包含我应用的客户ID的宏。)

此网址按预期工作。

但是,如下构造的URL一致地给我NSURLErrorDomain代码= -1000(在设备上和iPhone 5.1和6.0模拟器上):

double latitude = 48.858844;
double longitude = 2.294351;
parameters = [NSDictionary dictionaryWithObjectsAndKeys:
                  [NSNumber numberWithDouble:latitude], @"lat",
                  [NSNumber numberWithDouble:longitude], @"lng",
                  [NSNumber numberWithInt:2000], @"distance",
                  INSTAGRAM_CLIENT_ID, @"client_id",
                  nil];
URL = [URL URLByReplacingPathWithPath:@"/v1/media/search"];
URL = [URL URLByAppendingParameters:parameters];

然后我创建了一个NSURLRequest

NSURLRequest *req = [NSURLRequest requestWithURL:URL];

如果我从NSURLRequest打印出来的网址,那就好了:

https://api.instagram.com/v1/media/search?client_id=REDACTED&distance=2000&lat=48.858844&lng=2.294351

我正在使用来自Matt Neuburg的Programming iOS 5,第37章的MyDownloader。我创建了一个MyDownloader的实例并将其传递给NSURLRequest

MyDownloader *downloader = [[MyDownloader alloc] initWithRequest:req];

根据RFC 3986,下划线或点不需要转义,我没有看到任何其他要转义的内容,NSURL + PathParameters.h无论如何都应该处理转义。 那么这里发生了什么?我缺少什么?

为了增加奇怪性,这种构建URL的更简单方法也会产生同样的错误:

parameters = [NSDictionary dictionaryWithObjectsAndKeys:
    INSTAGRAM_CLIENT_ID, @"client_id", nil];
URL = [URL URLByReplacingPathWithPath:@"/v1/media/popular"];

看起来还不错:

https://api.instagram.com/v1/media/popular?client_id=REDACTED

所有这些网址都可以在Instagram API console中使用,也可以直接在Safari中使用。这些API调用不需要OAuth身份验证,只需要客户端ID。

如果有人能够指出问题是什么,我会很高兴。

编辑:使用以下内容对latlng值进行编码:

[[[NSNumber numberWithDouble:latitude] stringValue]
    stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]

网址或行为没有变化。但是,当我用文字%2E替换点时,路径助手会对百分号进行编码,从而产生%252E ......

1 个答案:

答案 0 :(得分:0)

解决。上面显示的URL没有任何问题。问题在于周围的代码。我正在回答我自己的问题,以便使用Instagram API的人可能会从答案中受益。

事实证明,API的/v1/tags/tagname/media/recent端点在JSON响应中返回pagination对象,但/v1/media/search/v1/media/popular没有。从该对象内部,您可以在名为next_url的值中找到下一批照片的网址。

因为我没有正确阅读文档(并且它在某些地方有点令人困惑),并且因为不同的Instagram API端点的工作方式不同,我的代码期望在所有这些情况下找到next_url值。因此,我从NSURLConnection获得的“错误网址”指的是第二个连接,而不是初始网址。由于我没有意识到在其他两个案例中没有分页,我认为问题必须在初始URL中。