iphone - AFNetworking SPARQL查询失败,URL错误

标签 iphone ios objective-c afnetworking sparql

我有以下使用AFNetworking来获取山脉列表的iOS代码。我在故障块中收到“错误的URL”错误。

 - (void) loadMountains
{
    NSString * loadMountainQueries = @"select * where { ?Mountain a dbpedia-owl:Mountain; dbpedia-owl:abstract ?abstract. FILTER(langMatches(lang(?abstract),"EN")) } ";        
    NSString * urlString = [NSString stringWithFormat:@"http://dbpedia.org/sparql/?query=%@",loadMountainQueries];

    NSLog(@"%@", urlString);

    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];    

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

    [AFHTTPRequestOperation addAcceptableContentTypes:
     [NSSet setWithObjects:@"application/json", @"sparql-results+json", @"text/json", @"text/html", @"text/xml", nil]];

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
    {
        NSLog(@"Response %@", [operation responseString]);
    }
    failure:^(AFHTTPRequestOperation *operation, NSError *error)
    {
        NSLog(@"Response %@", [operation responseString]);
        NSLog(@"Error: %@", error);
    }];

    [operation start];
}

我假设AFHTTPRequestOperation自动对URL进行编码,但是可以肯定的是-当我使用编码URL时,它会给出相同的响应“Bad URL”。在Safari中工作的同一查询在 objective-c 中无法工作。

我究竟做错了什么?

最佳答案

首先,第一行出现语法错误:

NSString * loadMountainQueries = @"select * where { ?Mountain a dbpedia-owl:Mountain; dbpedia-owl:abstract ?abstract. FILTER(langMatches(lang(?abstract),"EN")) } ";
---------------------------------------------------------------------------------------------------------------------------------------------------------^

您应该使用反斜杠转义引号:
... ang(?abstract),\"EN\")) } ";

现在的答案是:在将loadMountainQueries附加到主URL字符串之前,您必须%编码:
NSString *loadMountainQueries = @"select * where { ?Mountain a dbpedia-owl:Mountain; dbpedia-owl:abstract ?abstract. FILTER(langMatches(lang(?abstract),\"EN\")) } ";
NSString *encodedLoadMountainQueries = [loadMountainQueries stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *urlString = [NSString stringWithFormat:@"http://dbpedia.org/sparql/?query=%@",encodedLoadMountainQueries];

该网址在Safari中有效,因为它会自动对您的网址进行百分比编码。

关于iphone - AFNetworking SPARQL查询失败,URL错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16762639/

相关文章:

iphone - 检测模拟器的类型

iphone - 键盘隐藏 UITextField。怎么解决这个问题呢?

iphone - 将 JSON 数组插入 Sqlite iPhone

iOS 9 : UIPrintInteractionController presentation issue

ios - 如何在 UIKit 上的 Xcode 11/iOS13 中使用协调器模式?

objective-c - Cocoa 类成员变量在函数调用内部分配 nil 除非强制初始化/加载

ios - 使用导航 Controller 时将 View Controller 初始化为初始 View Controller ?[Objective-C]

ios - 无法使用 Flutter 1.22.3 编译 Flutter 应用程序

c - 在 Objective C 中使用 C 结构

objective-c - 如何从字体文件中获取字体名称?