2013-06-01 143 views
2

我正在用CakePHP后端构建REST API。我试图获得一个JSON响应,我可以在iOS 6.1中使用AFNetworking进行解析,但是当我尝试使用AFNetworking命中我的API URL时出现错误。AFNetworking结果与CURL不同

下面就来AFNetworking有问题的电话:

[self postPath:@"/marks/markfav/1162" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     if (DEMO_LOGGING) NSLog(@"Done refreshing"); 
    }); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     NSLog(@"Request Failed with Error: %@", error.userInfo); 
    }); 
}]; 

这里与错误转储结果:

2013-06-05 00:19:35.018 ToWatchList[67945:c07] Request Failed with Error: { 
    AFNetworkingOperationFailingURLRequestErrorKey = "<NSMutableURLRequest http://towatchlist.com/marks/markfav/1162>"; 
    AFNetworkingOperationFailingURLResponseErrorKey = "<NSHTTPURLResponse: 0x8574250>"; 
    NSErrorFailingURLKey = "http://towatchlist.com/marks/markfav/1162"; 
    NSLocalizedDescription = "Expected status code in (200-299), got 500"; 
    NSLocalizedRecoverySuggestion = "{\"name\":\"An Internal Error Has Occurred.\",\"message\":\"\\/\"}"; 
} 

我敢肯定,PHP后台工作正常,因为我可以打与curl并获得预期的结果(注意我点击相同的URL作为上面的错误,都与POST请求):

$ curl -i --request POST http://towatchlist.com/marks/markfav/1162 
HTTP/1.1 200 OK 
Date: Wed, 05 Jun 2013 07:21:46 GMT 
Server: Apache/2.2.22 (Ubuntu) 
X-Powered-By: PHP/5.3.10-1ubuntu3.6 
Set-Cookie: CAKEPHP=ijmosqrl26cao4jv8vqlt15sa6; expires=Wed, 05-Jun-2013 11:21:46 GMT; path=/; HttpOnly 
Content-Length: 43 
Content-Type: application/json; charset=UTF-8 

{"result":"0","info":"Invalid Permissions"} 

我在同一个文件中有另一个工作的AFNetworking调用:[self getPath:@"/marks/data.json" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject)(它可以通过curl和iOS内部都正常工作,您可以用curl -i http://towatchlist.com/marks/data.json来打它)。

所以我不明白为什么我会得到第一次AFNetworking调用怪异的结果......我如何使它在命令行上的卷曲行为?

PS:为背景,通过调用这个函数与我的基本URL设置AFNetworking做一些基本的设置:

- (id)initWithBaseURL:(NSURL *)url 
{ 
    self = [super initWithBaseURL:url]; 
    if(!self) 
     return nil; 
    [self registerHTTPOperationClass:[AFJSONRequestOperation class]]; 
    [self setDefaultHeader:@"Accept" value:@"application/json"]; 
    [self setParameterEncoding:AFJSONParameterEncoding]; 
    [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]; 
    return self; 
} 
+0

运行'curl -i --request POST http:// dev.towatchlist.com/marks/markfav/1162'会从这里返回'403 Forbidden',所以很难帮助您诊断您的问题。 – 0xced

+0

我知道禁止的状态;我想我希望这个问题是我可以简单地用AFNetworking切换的,但显然不是这种情况,否则它会被回答。我应该努力更新代码,以便您可以从公共站点上找到它。一旦我完成了,我会更新这个问题。感谢这个方向的推动。 – Nick

+0

正如0xced建议的那样,我更新了我的帖子以便公开访问URL,以便您可以运行'curl -i --request POST http:// towatchlist.com/marks/markfav/1162'并获取有效的JSON(尽管它会只是告诉你这个URL是被禁止的,因为你没有传入预期的用户/密码)。感谢您的帮助。 – Nick

回答

0

原来,这是一个PHP(或者也许只是CakePHP)处理来自AFNetworking和CURL请求的细微差别的问题。

我的服务器在某种程度上认识到CURL请求没有GUI或会话变量,并在我用CURL打开URL时忽略了该PHP代码。但是,当使用AFNetworking时,它试图执行此代码($this->Session->setFlash($msg,'default',array('class'=>$class)); this->redirect($this->referer());)而不是忽略它,这会导致错误。

解决方案是将会话/重定向代码放入单独的PHP语句中,该语句不会从任何发布请求中执行。

2

您应该AFNetworking的最新版本试试。我只是测试版本1.3.0,一切都按预期工作,即成功块被称为{ info = "Invalid Permissions"; result = 0; } NSDictionary作为responseObject。

+0

感谢您检查了0xced。虽然它不是AFNetworking版本(我也是1.3.0),但它为您正确运行的事实更好地理解了问题的出处,并帮助我弄清楚了这一点。 – Nick