3

我正在实施忘记密码服务,在该服务中我将传递一个电子邮件地址,它会返回 JSON 以确认已发送的电子邮件。问题是我无法读取 json 中的响应字符串,并且我的异常消息显示 data 参数为 nil,但是如果我在 Web 浏览器中查看 url,则服务看起来很好,如下所述。我的代码是:

NSURL *url = [LokalmotionCommonTask getURLForgotPassword:emailFieldTxt.text];

    NSData* data = [NSData dataWithContentsOfURL: url];

    @try {
        NSError* error;
        NSDictionary* jsonDict = [NSJSONSerialization 
                                  JSONObjectWithData:data //1
                                  options:0 
                                  error:&error];

        NSLog(@"%@", [jsonDict objectForKey:@"response"]);
    }
    @catch (NSException *exception) {
        NSLog(@"forgot password exception: %@: %@", [exception name], [exception reason]);
    }

我在网络浏览器中得到的服务响应是这样的:

{"status":400,"response":"Your request to change password is already sent. Please check your email."}

例外:

forgot password exception: NSInvalidArgumentException: data parameter is nil
4

4 回答 4

3

在 Objective-C 中,异常仅用于致命错误,而不是可恢复的错误。相反,只需检查 nil 数据:

如果您需要知道失败的原因是什么,请使用:

NSError* error;
NSURL *url = [LokalmotionCommonTask getURLForgotPassword:emailFieldTxt.text];
NSData* data = [NSData dataWithContentsOfURL: url options:NULL error:&error];
if (data) {
    NSDictionary* jsonDict = [NSJSONSerialization 
                              JSONObjectWithData:data //1
                              options:0 
                              error:&error];
    NSLog(@"%@", [jsonDict objectForKey:@"response"]);
}
else {
    NSLog(@"forgot password error, %@", [error localizedFailureReason]);
}

存在命名约定错误:getURLForgotPassword:
以“get”开头的方法名称暗示将有一个按引用返回的参数。最好只命名方法:forgotPasswordURL:

以 get 为前缀的异常和访问器这两件事是与 Jave 的基本区别。

于 2012-05-09T11:10:49.233 回答
1

有错误说data parameter is nil。因此,您为 JSON-date 传递的变量可能是nil.
[NSData dataWithContentsOfURL:url]由于发生错误,可能返回 nil。尝试记录。

此外,即使它只是您请求的一个小文件,我也会进行异步请求,以免阻塞 UI。

于 2012-05-09T11:40:06.543 回答
1

我遇到了同样的问题,问题是我在 url 字符串中给出了额外的空间,即 url 字符串 @"http:...." 通过删除 url 字符串开头的空格来纠正它@"https:... 。”

于 2014-03-11T10:16:28.473 回答
0

通过修复服务 URL 解决了我的 url 未编码并且内联空格

于 2013-04-04T05:01:38.917 回答