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]);
    }

Web ブラウザーで取得するサービス応答は次のようになります。

{"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:

これら 2 つのこと、例外と 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 文字列 @" http:...." である URL 文字列に余分なスペースを与えたことで、URL 文字列 @"https:..." の先頭にあるスペースを削除して修正しました。 ."

于 2014-03-11T10:16:28.473 に答える
0

サービス URL を修正することで、URL がエンコードされず、インラインにスペースが含まれていた問題を解決しました

于 2013-04-04T05:01:38.917 に答える