在 400 HTTP 响应时在警报视图上显示 API 响应 JSON 格式的错误结果

Posted

技术标签:

【中文标题】在 400 HTTP 响应时在警报视图上显示 API 响应 JSON 格式的错误结果【英文标题】:Show error results from API Response JSON format on Alert View when 400 HTTP Response 【发布时间】:2014-05-14 17:08:07 【问题描述】:

想要像您在图片中看到的那样实现这一目标

以下信息可以正常工作,但我想做的是向用户显示来自 API 的响应,因为即使我验证了以下字段,nick,pass_field,type_account,email。 API 会响应该用户名是否正在使用或电子邮件是否无效。如下所示。我想要做的是修改此代码并使其向用户响应警报,其中每个字段的 API 响应 JSON 仅在 400 HTTP 响应期间响应以下字段

"nick": ["需要用户名"]

"nick": ["用户名 eddwinpaz 正在使用中"]

"email": ["Email field is required"]

"email": ["键入有效的电子邮件"]

"pass_field": ["必填字段"]

这是我的回应

2014-05-14 12:30:09.944 mobile-app[2337:60b] PostData: nick=&pass_field=&email=&type_account=0
2014-05-14 12:30:30.998 mobile-app[2337:60b] Response code: 400
2014-05-14 12:30:30.998 mobile-app[2337:60b] Response ==> "nick": ["Username eddwinpaz is in use"]

这是我的 ViewController.m

- (IBAction)registerClicked:(id)sender 
NSInteger success = 0;
@try 

        NSString *post =[[NSString alloc] initWithFormat:@"nick=%@&pass_field=%@&email=%@&type_account=%ld",[self.txtUsername text],
                         [self.txtPassword text],
                         [self.txtEmail text],
                         (long)[self.userType selectedSegmentIndex]];
        NSLog(@"PostData: %@",post);

        NSURL *url=[NSURL URLWithString:@"http://api.samplewebsite.ca/user-register/?format=json"];

        NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

        NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]];

        NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
        [request setURL:url];
        [request setHTTPMethod:@"POST"];
        [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
        [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
        [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
        [request setHTTPBody:postData];

        //[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:[url host]];

        NSError *error = [[NSError alloc] init];
        NSHTTPURLResponse *response = nil;
        NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

        NSLog(@"Response code: %ld", (long)[response statusCode]);

        NSString *responseData = [[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];
        NSLog(@"Response ==> %@", responseData);

        if ([response statusCode] == 201)
        
            NSString *responseData = [[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];
            NSLog(@"Response ==> %@", responseData);

            NSError *error = nil;
            NSDictionary *jsonData = [NSJSONSerialization
                                      JSONObjectWithData:urlData
                                      options:NSJSONReadingMutableContainers
                                      error:&error];

            success = [jsonData[@"success"] integerValue];
            NSLog(@"Success: %ld",(long)success);


                NSLog(@"Login SUCCESS");

                NSString *error_msg = (NSString *) jsonData[@"error_message"];

                [self alertStatus:error_msg :@"Your Account has been created, Now login" :0];
                [self performSegueWithIdentifier:@"login" sender:self];



         else 

            [self alertStatus:@"Connection Failed" :@"Registration Failed, Please check empty or invalid fields!" :0];
        


    @catch (NSException * e) 
        NSLog(@"Exception: %@", e);
        [self alertStatus:@"Sign in Failed." :@"Error!" :0];
    


【问题讨论】:

你有什么问题?您发布的代码显示没有尝试执行您的要求。首先尝试,然后在遇到特定问题时更新您的问题。 一个字都听不懂 我想显示作为警报结果而不是来自 ios 验证的 JSON,因为 API 会验证数据库中是否已经存在 nick 字段。 我给出的答案与您正在寻找的内容相符,但请重新考虑不要为此使用警报。 @LyricalPanda 更新了问题并添加了图片 【参考方案1】:

这看起来比使用 AlertView 好很多。为此,请在字段上方添加三个带有右对齐的标签(emailErrorLabel、nickErrorLabel、passErrorLabel)。

responseData 转换为NSDictionary,以便提取密钥。然后你会得到类似下面的东西:

if ([response statusCode] == 201)
 ... 
else if ([response statusCode] == 400)
 
   NSArray *keys = [responseData allKeys];
   for (NSString * key in keys)
   
     if ([key isEqualToString:@"email"])
       emailErrorLabel.text = [responseData objectForKey:key];
     else if ([key isEqualToString:@"nick"])
       nickErrorLabel.text = [responseData objectForKey:key];
     else if ([key isEqualToString:@"pass_field"])
       passErrorLabel.text = [responseData objectForKey:key];
   


【讨论】:

这是 REgisterViewController.h imageshack.com/a/img838/1282/rzeq.png 这是 .m imageshack.com/a/img845/2524/ehw8.png 查看此链接。当 ResponseData 采用这种格式时,它真的不应该是一个字符串。根据您在问题***.com/questions/12603047/… 中指定的返回将其更改为NSDictionary @eddwinpaz 这解决了您的问题吗?

以上是关于在 400 HTTP 响应时在警报视图上显示 API 响应 JSON 格式的错误结果的主要内容,如果未能解决你的问题,请参考以下文章

使用警报对话框时在回收站视图中从 Firebase 中删除项目

在 iOS8.3 上显示警报视图时,iOS 键盘通知不必要地触发

在导航到下一个片段时在底部导航视图中打开警报对话框

如何在后退按钮上重新加载上一个视图控制器?

当用户离开页面时在 angularjs 中显示警报

当Android设备设置为AP时在wireshark上捕获手机流量