使用AFNetworking 2.0发布JSON数据

44

我有一个 Web 脚本,可以通过 HTTP POST 请求接受 JSON 字符串作为输入。我看到了几个使用 AFNetworking 1.x 的示例,它们使用相同的方法。请问是否有人可以指导我或提供 AFNetworking 2.0 的示例,以便将格式化的 JSON 作为输入发送到 Web 脚本中?

谢谢。


请阅读AFNetworking GitHub页面上的迁移指南。 - Wain
问题是我对AFNetworking很陌生,所以我不太清楚并希望了解之前的版本。我来自ASIHTTP背景,感谢您的建议。 - vishal dharankar
1
在http://cocoadocs.org/docsets/AFNetworking/2.1.0/上搜索JSON和POST,你需要尝试一些东西然后寻求帮助... - Wain
@wain 我希望这个问题能够简单明了,即使是初学者也能够理解。 - vishal dharankar
5个回答

78

在查阅文档并尝试一些代码之后,我得到了以下示例:

 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];


NSDictionary *params = @ {@"user" :txtUserName, @"pwd" :txtPwd };


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

同时不要忘记在服务器脚本中设置响应头类型为Application/json。


1
这对我不起作用。我一直收到这个错误:状态码:200,标头{ 连接=关闭; “内容长度”= 59; “内容类型”=“text / html; charset = UTF-8”; 日期=“2014年4月21日星期一06:44:34 GMT”; 服务器=“Apache / 2.2.25(亚马逊)”; “X-Powered-By”=“PHP / 5.3.27”; } },NSLocalizedDescription =请求失败:不可接受的内容类型:text / html} - Nitesh
2
@Nitesh,你在回答中忽略了我的最后一句话:“还要不要忘记在服务器脚本中设置响应头类型为Application/json”。 - vishal dharankar
如果您无法更改服务器脚本,可以查看此答案以使JSON解析器接受"text/html"内容类型。 - mgarciaisaia
NSCocoaErrorDomain Code=3840 - Olcay Ertaş
这可能会对你有所帮助:https://dev59.com/TGEi5IYBdhLWcg3wPadh - vishal dharankar
显示剩余2条评论

20

这是一些简单的模板,用于将POST参数以JSON格式存储在NSMutableDictionary参数中。适用于AFNetworking 2.4.1。

NSString *baseURL = @"http://your-server.com/";
NSString *path = @"method/url/";

NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
[parameters setObject:@"value" forKey:@"key"];

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseURL];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];

[manager POST:path parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {

        NSLog(@"JSON: %@", responseObject);
        //here is place for code executed in success case

} failure:^(NSURLSessionDataTask *task, NSError *error) {

        //here is place for code executed in error case
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error while sending POST"
                                                            message:@"Sorry, try again."
                                                           delegate:nil
                                                  cancelButtonTitle:@"Ok"
                                                  otherButtonTitles:nil];
        [alertView show];

        NSLog(@"Error: %@", [error localizedDescription]);
}];

1
我不确定,但这似乎不再起作用了。请查看此问题 - Hemang
我没有检查过AFNetworking的更新版本。但是它肯定可以在2.4.1版本上运行。 - lukszar

8
如果您想向服务器发送JSON,您应该按照以下方式发布您的参数。
使用此方法,您可以在请求头中找到“Content-Type”为“application/json”。
AFJSONRequestSerializer *serializer = [AFJSONRequestSerializer serializer];
[serializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[serializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
manager.requestSerializer = serializer;

 NSDictionary *paras = @{@"uid" : @(10020)};

[manager POST:@"http://your.request.url" parameters:paras success:^(AFHTTPRequestOperation *operation, id responseObject) {



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

    NSLog(@"the falire is %@", error);

}];

希望这能有所帮助。 :)

那很好用,谢谢。请也给我的答案评分哦 :) - Muhammad Ahsan

5

在Swift中:

manager.AFHTTPRequestOperationManager中添加以下内容:

manager.requestSerializer = AFJSONRequestSerializer(writingOptions: NSJSONWritingOptions.PrettyPrinted)

2

如果您想发布参数字典JSON字符串,请使用以下代码

NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"your_webservice_post_url"]];
[urlRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[urlRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
NSError *error;
NSDictionary *parameters = @{@"customValue":@"value"};
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:parameters options:NSJSONWritingPrettyPrinted error:&error];
 [urlRequest setHTTPMethod:@"POST"];
 [urlRequest setHTTPBody:jsonData];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接