5

我最近跟随CodeSchool 课程学习 iOS,他们推荐使用 AFNetworking 与服务器交互。

我正在尝试从我的服务器获取 JSON,但我需要将一些参数传递给 url。我不希望将这些参数添加到 URL,因为它们包含用户密码。

对于一个简单的 URL 请求,我有以下代码:

NSURL *url = [[NSURL alloc] initWithString:@"http://myserver.com/usersignin"];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];

AFJSONRequestOperation *operation = [AFJSONRequestOperation
       JSONRequestOperationWithRequest:request
               success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
                        NSLog(@"%@",JSON);
               } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
                        NSLog(@"NSError: %@",error.localizedDescription);             
               }];

[operation start];

我检查了NSURLRequest的文档,但没有从那里得到任何有用的信息。

我应该如何将用户名和密码传递给该请求以在服务器中读取?

4

2 回答 2

6

您可以使用AFHTTPClient

NSURL *url = [[NSURL alloc] initWithString:@"http://myserver.com/"];
AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:url];

NSURLRequest *request = [client requestWithMethod:@"POST" path:@"usersignin" parameters:@{"key":@"value"}];

AFJSONRequestOperation *operation = [AFJSONRequestOperation
   JSONRequestOperationWithRequest:request
           success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
                    NSLog(@"%@",JSON);
           } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
                    NSLog(@"NSError: %@",error.localizedDescription);             
           }];

[operation start];

理想情况下,您应该继承AFHTTPClient并使用它的postPath:parameters:success:failure:方法,而不是手动创建操作并启动它。

于 2013-05-17T14:55:03.180 回答
2

您可以通过这种方式在 NSURLRequest 上设置 POST 参数:

NSString *username = @"theusername";
NSString *password = @"thepassword";

[request setHTTPMethod:@"POST"];
NSString *usernameEncoded = [username stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *passwordEncoded = [password stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSString *postString = [NSString stringWithFormat:[@"username=%@&password=%@", usernameEncoded, passwordEncoded];
[request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];

换句话说,您创建查询字符串的方式与在 URL 中传递参数的方式相同,但将方法设置为POST并将字符串放在 HTTP 正文中,而不是?在 URL 中的后面。

于 2013-05-17T14:45:30.627 回答