AFNetworking 对用户名和密码参数的异步 POST 请求(Objective-C iOS)

Posted

技术标签:

【中文标题】AFNetworking 对用户名和密码参数的异步 POST 请求(Objective-C iOS)【英文标题】:AFNetworking asynchronous POST request for username and password parameter (Objective-C iOS) 【发布时间】:2015-01-11 15:15:20 【问题描述】:

我是 ios 开发的新手,我被困在我的小项目中,我必须创建对 php 网站的异步 POST 请求。我在网上阅读了资源,发现 AFNetworking 最适合做这项工作,所以我通过终端使用 cocoapods 安装了 AFNetworking 2.4。我有一个视图控制器,它有 2 个文本字段(用户名和密码),每当我按下登录按钮时,我都会向 php 网站发送一个异步 POST 请求。POST 请求必须包含参数“用户名”和“密码”,并且会收到一个带有“代码”和“消息”的 JSON 响应。我必须在 UIAlert 中显示解析的代码和消息,以及 api 调用花费了多长时间(以毫秒为单位)。唯一有效的登录名是用户名:Yomaki 密码:asdfgh。登录成功后,点击 UIAlert 上的“确定”应该会让我们回到 MainMenuViewController。请查看我在下面尝试过的代码。我曾尝试在线学习几个教程,但没有奏效。

请看下面的代码,

(IBAction)loginButton:(id)sender



    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    NSDictionary *parameters = @@"Yomaki": _usernameTextField, @"asdfgh": _passwordTextField;

    NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"PHP URL HERE"]];
    AFHTTPRequestOperation * operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];


请帮我写代码,因为这是我第一次向 php 网站发送异步 POST 请求。

提前致谢。

【问题讨论】:

缺少发送请求,还要注意没有指定“POST”。查看一些展示如何使用 AFNetworking 的教程。 Zaph,感谢您的帮助,我确实查看了一些教程并更正了我在代码中需要的内容。你也可以看看我在下面对 Rob 所做的评论,我真的不知道发生了什么。你能帮忙吗?提前感谢并感谢您的帮助! 我通过在下面添加 code.manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"]; 【参考方案1】:

您不想使用_usernameTextFieldUITextField),而是使用_usernameTextField.text,或者更好的是self.usernameTextField.text(该测试字段的NSString 属性)。密码也是如此。

我也会使用POST 方法:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @@"userid": self.usernameTextField.text, @"password": self.passwordTextField.text;

[manager POST:url parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) 
    NSLog(@"JSON: %@", responseObject);
 failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    NSLog(@"Error: %@", error);
];

请注意,在您的字典中,您已将字段名称(可能类似于 useridpassword,但请咨询您的 Web 服务作者)替换为示例用户 ID/密码值。我认为您想恢复原始字段名称。

【讨论】:

非常感谢。好的,我按照您的建议进行了更正,并添加了您所说的代码。由于某种原因,我仍然无法获得我想要的那种响应。当我在模拟器中按下登录按钮时,它根本没有做任何事情,它也没有给我我们在块中编写的 NSLog 消息。如果您能告诉我如何创建一个警报,在无法登录时显示消息,当我们输入正确的密码警报将显示登录成功消息并将我们带回根视图控制器,那将是很棒的。感谢您的帮助!! 如果您没有看到这些NSLog 语句中的任何一个,这让我怀疑它根本没有到达这段代码。确保您的IBAction 已正确连接。在POST 调用之前放置一个NSLog 或断点,这应该可以帮助您确认它根本没有运行。 感谢您的帮助。我通过使用 manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"]; 解决了这个问题 是的,如果您的服务器代码忽略了添加标头,acceptableContentTypes 将解决这个问题。 (这并不能解释您之前报告的行为,即既没有调用成功块也没有调用失败块,但我认为您解决了这个问题。)就个人而言,我只是修复服务器代码以发送正确的标头,但无论如何都可以。 ..【参考方案2】:

来自:Junda Ong教程

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager POST:@"yourURL"
   parameters: parameters
      success:^(AFHTTPRequestOperation *operation, id responseObject) 
          NSLog(@"JSON: %@", responseObject); 
      failure:^(AFHTTPRequestOperation *operation, NSError *error) 
          NSLog(@"Error: %@", error);
      ];

【讨论】:

您好 Zaph,感谢您的帮助。我确实发布了代码,但是当我单击模拟器中的登录按钮时它没有做任何事情。你能帮我确定什么是错的。它甚至不写 NSLog 消息。您知道如何创建警报以显示错误密码,如果正确,alertview 上的确定按钮会将我们带到 rootviewcontroller。提前致谢。 基本调试正常。代码甚至被调用了吗?在 m 消息 POST 之前使用调试器和断点NSLog()【参考方案3】:
NSURL * url = @"your url";
NSString * user = ([userField.text length] == 0) ? @"" : userField.text;
NSString * pass = ([passField.text length] == 0) ? @"" : passField.text;

NSMutableDictionary * postVars = [NSMutableDictionary dictionary];

[postVars setObject:user forKey:@"username"];
[postVars setObject:pass forKey:@"password"];

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager POST:url parameters:postVars success:^(AFHTTPRequestOperation *operation, id responseObject) 

    if ([responseObject isKindOfClass:[NSDictionary class]])

        if ([responseObject objectForKey:@"code"]) && ([responseObject objectForKey:@"message"])

            NSString * code = [responseObject objectForKey:@"code"];
            NSString * message = [responseObject objectForKey:@"message"];

        

    

 failure:^(AFHTTPRequestOperation *operation, NSError *error) 

    // something went wrong with your http post

];

【讨论】:

以上是关于AFNetworking 对用户名和密码参数的异步 POST 请求(Objective-C iOS)的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking 中的 JSON 错误

AFNetworking : 发送异步数据 mde "Post"

处理AFNetworking2.0异步HTTP请求

表视图和 AFNetworking 异步调用

AFNetworking 2.0 POST 请求无法快速工作

AFNetworking 异步下载 GIF 带占位符