【问题标题】:Getting JSON data using NSURLSession使用 NSURLSession 获取 JSON 数据
【发布时间】:2016-06-05 11:17:48
【问题描述】:

我正在尝试使用 NSURLSession 从 google distance api 获取数据,但如下所示,当我打印响应和数据时,我得到的结果为 NULL。 可能是什么问题?或者有没有其他更好的方式来获取 JSON 数据。

NSString *urlAsString = [NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/distancematrix/json?origins=Vancouver+BC|Seattle&destinations=San+Francisco|Victoria+BC&mode=bicycling&language=fr-FR&key=API-KEY"];

NSURL *url = [NSURL URLWithString:urlAsString];


NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

[[session dataTaskWithURL:[NSURL URLWithString:urlAsString]
            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

                NSLog(@"RESPONSE: %@",response);
                NSLog(@"DATA: %@",data);


            }] resume];

【问题讨论】:

  • 你为什么用stringWithFormat
  • 您可能需要编辑您的 api 密钥以保护自己免受服务滥用。
  • 你不需要那个独立的“NSURL *url =”在那里排队。你不用它。
  • 我认为问题在于 URL

标签: ios objective-c iphone json nsurlsession


【解决方案1】:

你应该在你的 url 字符串上使用stringByAddingPercentEscapesUsingEncoding:,这就是你没有得到响应的原因:服务器返回了一个错误。

您应该检查过error ;)

我在 URL 字符串中替换了您的 API 密钥,如果您复制/粘贴我的代码,请记住输入您自己的 :)

NSString *urlAsString = [NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/distancematrix/json?origins=Vancouver+BC|Seattle&destinations=San+Francisco|Victoria+BC&mode=bicycling&language=fr-FR&key=YOUR-API-KEY"];

NSCharacterSet *set = [NSCharacterSet URLQueryAllowedCharacterSet];
NSString *encodedUrlAsString = [urlAsString stringByAddingPercentEncodingWithAllowedCharacters:set];

NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

[[session dataTaskWithURL:[NSURL URLWithString:encodedUrlAsString]
        completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

    NSLog(@"RESPONSE: %@",response);
    NSLog(@"DATA: %@",data);

    if (!error) {
        // Success
        if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
            NSError *jsonError;
            NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];

            if (jsonError) {
                // Error Parsing JSON

            } else {
                // Success Parsing JSON
                // Log NSDictionary response:
                NSLog(@"%@",jsonResponse);
            }
        }  else {
            //Web server is returning an error
        }
    } else {
        // Fail
        NSLog(@"error : %@", error.description);
    }
}] resume];

【讨论】:

  • 谢谢!编码已经奏效..但是你编码的方式在 iOS 9 以后被弃用了。
【解决方案2】:

如果您打印出错误参数中返回的内容,您可能会得到一个非常好的提示。

IE:

NSString *unencodedURLString = [NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/distancematrix/json?origins=Vancouver+BC|Seattle&destinations=San+Francisco|Victoria+BC&mode=bicycling&language=fr-FR&key=API-KEY"];
NSString *encodedURLString = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                        NULL,
                        (CFStringRef)unencodedURLString,
                        NULL,
                        (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                        kCFStringEncodingUTF8 );

[[session dataTaskWithURL:[NSURL URLWithString:encodedURLString]
            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

    if (error != nil)
    {
       // if there's an error, print it out...
       NSLog(@"error in NSURLSession is %@", [error localizedDescription]);
    } else {
       NSLog(@"RESPONSE: %@",response);
       NSLog(@"DATA: %@",data);
    }
}] resume];

我正在使用的 URL 编码例程 is found here

【讨论】:

  • 它说 URL 不受支持。但如果我在浏览器上运行相同的 url,我会看到 json 数据。
  • @Rusty 好吧,给你。
  • @njzk2 我不明白。
  • 是的,我明白..但如果 url 在浏览器中给我 json,则意味着我的 url 是正确的。 @njzk2 格式有什么问题?
  • 这可能与 URL 编码参数有关
【解决方案3】:

来自文档:

网址必须采用以下格式:

https://maps.googleapis.com/maps/api/distancematrix/json?origins=Vancouver+BC|Seattle&destinations=San+Francisco|Victoria+BC&key=YOUR_API_KEY

您正在请求:

origins: Vancouver+BC|Seattle
destinations: San+Francisco|Victoria+BC
mode: driving
key: API_KEY

过境:

https://maps.googleapis.com/maps/api/distancematrix/json?origins=Vancouver+BC|Seattle&destinations=San+Francisco|Victoria+BC&mode=transit&transit_mode=train&key=YOUR_API_KEY

您要求:

  origins: Vancouver+BC|Seattle
destinations: San+Francisco|Victoria+BC
mode: transit
transit_mode: train
key: API_KEY

【讨论】:

  • 我有相同的网址..仍然显示不支持的网址
  • 尝试删除您的网址中的语言标签
  • 我不确定 API 密钥中是否有破折号。还要检查您的 api 密钥是否正确。
  • 您是否检查了 chrome 中 POSTMan 插件中的链接?看看你那里有没有 json 数据
  • 我们如何在谷歌距离矩阵 API 请求中传递经度和纬度?如果我使用 Google Places 检索了一个地点,如何将该地点传递给 Google Distance Matrix API? @Mr.T
猜你喜欢
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 2016-10-04
  • 2018-02-11
  • 1970-01-01
相关资源
最近更新 更多