我正在实施忘记密码服务,我会在其中传递一个电子邮件地址,它将返回JSON以确认已发送的电子邮件。问题是我无法在json中读取响应字符串,并且我的异常消息显示数据参数为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
答案 0 :(得分:3)
异常仅用于致命错误,不能用于可恢复的错误。而只是检查零数据:
如果您需要知道失败的原因,请使用:
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的基本区别。
答案 1 :(得分:1)
错误说data parameter is nil
。因此,您为JSON日期传递的变量可能是nil
发生错误后[NSData dataWithContentsOfURL:url]
可能返回nil。尝试记录它。
此外,即使它只是您请求的小文件,我也会寻求异步请求,以免阻止用户界面。
答案 2 :(得分:1)
我遇到了同样的问题,问题是我在url字符串中给了额外的空间url string @“http:....”通过删除url字符串@“https:”开头的空格来纠正它......“
答案 3 :(得分:0)
通过修复服务网址解决了这个问题,我的网址没有编码,内联空格