如何使用 AFNetworking 将数据发布到 Parse.com

Posted

技术标签:

【中文标题】如何使用 AFNetworking 将数据发布到 Parse.com【英文标题】:How to use AFNetworking to POST data to Parse.com 【发布时间】:2014-03-24 12:05:09 【问题描述】:

我在使用 AFNetworking 和 Parse.com 时遇到问题。我正在尝试将数据发布到数据库,但没有运气。我对网络的东西不太熟悉,所以我把它当作一个学习练习。

我已经让 GET 命令工作了,所以我知道数据库设置正确并且可以正常工作,但是 POST 是另一回事。我正在使用AFNetworking 2.2.0 将一个简单的测试字符串发布到解析后端。

这是我为 GET 命令工作的代码:

-(void)getParseData

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

[manager.requestSerializer setValue:kSDFParseAPIApplicationId forHTTPHeaderField:@"X-Parse-Application-Id"];
[manager.requestSerializer setValue:kSDFParseAPIKey forHTTPHeaderField:@"X-Parse-REST-API-Key"];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

[manager GET:@"https://api.parse.com/1/classes/some_data/" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) 
    NSLog(@"JSON: %@", responseObject);

 failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    NSLog(@"Error: %@", error);
];

这是迄今为止我为 POST 命令提供的代码,但它不起作用:

-(void)postParseData
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

[manager.requestSerializer setValue:kSDFParseAPIApplicationId forHTTPHeaderField:@"X-Parse-Application-Id"];
[manager.requestSerializer setValue:kSDFParseAPIKey forHTTPHeaderField:@"X-Parse-REST-API-Key"];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

manager.responseSerializer = [[AFJSONResponseSerializer serializer]init];

NSDictionary *params = @@"test_string" : @"NameTest";

[manager POST:@"https://api.parse.com/1/classes/warm_data/" parameters: params  success:^(AFHTTPRequestOperation *operation, id responseObject) 
    NSLog(@"POST data JSON returned: %@", responseObject);
 failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    NSLog(@"Error: %@", error);
];

我知道有一个用于 ios 的自定义 parse.com API 用于此目的,但我想使用 AFNetworking 来了解更多信息并进行改进。我尝试了我在网上找到的几种不同的东西,特别是堆栈溢出,但注意到产生了结果。以下是 AFHTTPRequestOperation 失败块返回的错误消息:

 2014-03-24 11:42:07.894 testApp[3222:60b] Error: Error Domain=AFNetworkingErrorDomain Code=-1011 "Request failed: bad request (400)" UserInfo=0xfe0f400 NSErrorFailingURLKey=https://api.parse.com/1/classes/some_data/, AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0x14780070>  URL: api.parse.com/1/classes/some_data/   status code: 400, headers 
    "Access-Control-Allow-Origin" = "*";
    "Access-Control-Request-Method" = "*";
    "Cache-Control" = "no-cache";
    Connection = "keep-alive";
    "Content-Length" = 130;
    "Content-Type" = "application/json; charset=utf-8";
    Date = "Mon, 24 Mar 2014 11:42:07 GMT";
    Server = "nginx/1.4.2";
    "Set-Cookie" = "_parse_session=BAh7BkkiD3Nlc3Npb25faWQGOgZFRiIlYWQyNmFhMTA3ZTJkZjljYjA3MjZkZTA1MGQzNWIzNGE%3D--f7812e190b5812d8bba91aea2b12d51412bf84ce; domain=.parse.com; path=/; expires=Wed, 23-Apr-2014 11:42:07 GMT; secure; HttpOnly";
    Status = "400 Bad Request";
    "X-Runtime" = "0.049574";
    "X-UA-Compatible" = "IE=Edge,chrome=1";
 , NSLocalizedDescription=Request failed: bad request (400)

我们不胜感激。如果我忘记了任何事情或遗漏了解决问题所需的内容,请告诉我,我会尽我所能补充。

【问题讨论】:

发帖时不应在 URL 路径上使用斜杠。 我刚刚从 URL 路径中删除了尾部斜杠,所以它现在是:api.parse.com/1/classes/warm_data,但不幸的是它仍然是相同的错误消息。 您的warm_data 类是否已存在于数据浏览器中? @Wain 是的,确实如此。我试图从 Parse.com 添加一张数据浏览器的图片给你看,但我还没有获得足够高的分数来发布图片。 您确定您的密钥正确吗?使用 CURL 是否适用于相同的请求? 【参考方案1】:

在尝试了有用的评论者的建议并阅读了更多内容并尝试了一些东西后,我得到了 AFNetworking 的 POST 工作!工作代码如下:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

manager.requestSerializer = [AFJSONRequestSerializer serializer];

[manager.requestSerializer setValue:kSDFParseAPIApplicationId forHTTPHeaderField:@"X-Parse-Application-Id"];
[manager.requestSerializer setValue:kSDFParseAPIKey forHTTPHeaderField:@"X-Parse-REST-API-Key"];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

NSDictionary *dic2 = @@"test_number": @1234;

[manager POST:@"https://api.parse.com/1/classes/warm_data" parameters: dic2
      success:^(AFHTTPRequestOperation *operation, id responseObject) 
          NSLog(@"POST data JSON returned: %@", responseObject);
      
      failure:^(AFHTTPRequestOperation *operation, NSError *error) 
          NSLog(@"Error: %@", error);
      
 ]; 

这与之前的代码相同,但很奇怪。我浏览了AFNetworking docs 和其他关于 AFnetworking 的帖子,包括一些 *** questions here 并遇到了

.securityPolicy.allowInvalidCertificates = YES;

AFHTTPRequestOperationManager 的一部分。我在经理声明下方添加了这一行:

manager.securityPolicy.allowInvalidCertificates = YES;

突然间它开始工作了!然后我将 manager.securityPolicy.allowInvalidCertificates 设置为 NO 并且它仍然有效?!?!然后我完整地删除了该行,它继续工作,为我将内容发布到 Parse。很奇怪。我没有解释这是如何修复它的,也许它在证书被删除时强制解析服务器允许它,我也不知道。我很想知道发生了什么变化,但现在我将继续构建应用程序的其余部分。如果有人有任何理论,我很想听听他们!

再次感谢所有花时间提出建议的评论者,我很感激。

【讨论】:

以上是关于如何使用 AFNetworking 将数据发布到 Parse.com的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AFNetworking 2.0 将包含字典的数组发送到服务器?

如何将 AFNetworking 添加到 XCode 应用程序

缓存策略,AFNetworking

如何通过 AFNetWorking 2.0 将 JSON 格式的数据发送到 Web? [复制]

AFNetworking 3.0 迁移

我们如何使用 AFNetworking 3.0 记录请求