【问题标题】:stringWithContentsOfUrl failing after updating to OS3.1stringWithContentsOfUrl 更新到 OS3.1 后失败
【发布时间】:2009-09-11 20:30:05
【问题描述】:

我有一个运行良好的应用程序,但由于我更新到 OS3.1 并更新了 SDK,应用程序无法登录到远程服务器,将连接字符串传递给 stringWithContentsOfUrl 函数。

在更新之前这工作正常,如果我复制显示在 NSLog 语句上的文本字符串并将其粘贴到浏览器中,那么我会得到正确的响应,但是,这是用“LOGIN_ERROR”回复表示失败.

知道为什么现在失败以及如何解决它吗?

NSString* userName = [[NSUserDefaults standardUserDefaults] stringForKey:@"username_pref"];
    NSString* password = [[NSUserDefaults standardUserDefaults] stringForKey:@"password_pref"];
    NSString* loginUrl = [NSString stringWithFormat:@"https://website.com/API/login?email=%@&password=%@", userName, password];

    NSLog (@"Logging in as %@ using %@ at [%@]", userName, password, loginUrl);

    NSURL* url = [NSURL URLWithString:loginUrl];
    NSString* loginDetails = [NSString stringWithContentsOfURL:url encoding:NSASCIIStringEncoding error:nil];

    if ([loginDetails compare:@"\"LOGIN_ERROR\""] == NSOrderedSame) 
    {
        DLog (@"Login Failed : LOGIN_ERROR");
        self.isLoggedIn = NO;
    }
    else
    {
        DLog (@"Login Success");
        if (userDetails) {
            [userDetails release];
        }

        NSDictionary* jsonData          = [loginDetails JSONValue];

        userDetails                     = [[[DMUserDetails alloc] init] retain];
        userDetails.id                  = [[jsonData objectForKey:@"id"] intValue];
        userDetails.api_token           = [jsonData objectForKey:@"api_token"];
        userDetails.full_name           = [jsonData objectForKey:@"full_name"];
        userDetails.mobile_number       = [jsonData objectForKey:@"mobile_number"];
        userDetails.mobile_host         = [jsonData objectForKey:@"mobile_host"];
        userDetails.email               = [jsonData objectForKey:@"email"];
        userDetails.twitter             = [jsonData objectForKey:@"twitter"];
        userDetails.jabber              = [jsonData objectForKey:@"jabber"];
        userDetails.msn                 = [jsonData objectForKey:@"msn"];
        userDetails.start_page          = [jsonData objectForKey:@"start_page"];
        userDetails.date_format         = [[jsonData objectForKey:@"date_format"] intValue];
        userDetails.time_format         = [[jsonData objectForKey:@"time_format"] intValue];
        userDetails.sort_order          = [[jsonData objectForKey:@"sort_order"] intValue];
        userDetails.timezone            = [jsonData objectForKey:@"timezone"];
        userDetails.tz_offset           = [jsonData objectForKey:@"tz_offset"];
        userDetails.premium_until       = [jsonData objectForKey:@"premium_until"];
        userDetails.default_reminder    = [jsonData objectForKey:@"default_reminder"];

        self.isLoggedIn = YES;
    }

    [self performSelectorOnMainThread:@selector(didFinishLogon) withObject:nil waitUntilDone:NO];

【问题讨论】:

  • 如果有可能,您可能想查看 Web 服务器日志。
  • 不幸的是它不是我的网络服务器,所以这是不可能的
  • 代码对我来说看起来不错。返回消息是否发生了变化,可能是在不同的服务器之间?
  • 奇怪的是,没有。将 URL 复制并粘贴到浏览器中可以正常工作。所以我知道字符串是正确的。但是通过stringWithContentsOfUrl方法传递失败,说明它正在改变正在传递的内容或者正在以不同的方式传递它,我不知道为什么
  • 好的,我已经通过实现 NSURLRequest 和 NSURLConnection 修复了它。意味着我必须重组获取内容的方式。我没有收到任何连接错误,而是收到来自服务器的错误响应,有点表明用户名和密码错误,但输出证明它们是错误的(可能是字符编码?)。有趣的是,这似乎只是这个调用的问题,它是 https 而不是 http。其余的 http 调用工作正常。

标签: iphone objective-c url


【解决方案1】:

如果您的用户名是一个电子邮件地址并且其中有一个 at 符号 (@),您是否尝试过使用 %40 而不是 @ 来转义 URL 中的 at 符号?

【讨论】:

    【解决方案2】:

    最可能的问题是 loginDetails 为 nil,表示检索 URL 时出错,而不是您实际收到“LOGIN ERROR”响应。

    传入一个错误对象并记录错误。

    【讨论】:

    • 服务器在失败的情况下返回字符串“LOGIN_ERROR”,但我访问的URL是正确的。如果我将字符串从日志复制并粘贴到浏览器,它工作正常。
    【解决方案3】:

    试试:

    NSError *error = nil;
    NSString *loginDetails = [NSString stringWithContentsOfURL:url encoding:NSASCIIStringEncoding error:&error];
    
    if (error != nil) {
        NSLog(@"%@", error);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-20
      • 2018-09-06
      • 1970-01-01
      • 2018-04-19
      • 2020-05-04
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 2019-12-23
      相关资源
      最近更新 更多