我查看了我能找到的所有相关问题(搜索:“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。
如果有人能够指出问题是什么,我会很高兴。
编辑:使用以下内容对lat
和lng
值进行编码:
[[[NSNumber numberWithDouble:latitude] stringValue]
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
网址或行为没有变化。但是,当我用文字%2E
替换点时,路径助手会对百分号进行编码,从而产生%252E
......
答案 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中。