AFNetworking结果与CURL不同

时间:2013-06-01 06:36:29

标签: rest curl ios6 afnetworking

我正在使用CakePHP后端构建REST API。我正在尝试获取可以使用iOS 6.1中的AFNetworking进行解析的JSON响应,但是当我尝试使用AFNetworking点击我的API URL时出现错误。

这是对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调用时得到奇怪的结果...如何让它在命令行上表现得像curl一样?

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;
}

2 个答案:

答案 0 :(得分:2)

您应该尝试使用最新版本的AFNetworking。我刚刚使用1.3.0版进行了测试,一切都按预期工作,即使用{ info = "Invalid Permissions"; result = 0; } NSDictionary作为responseObject调用成功块。

答案 1 :(得分:0)

事实证明,这是一个问题,在PHP(或者可能只是CakePHP)如何处理来自AFNetworking和CURL的请求方面存在细微差别。

我的服务器以某种方式识别出CURL请求没有GUI或会话变量,并且当我使用CURL点击URL时忽略了PHP代码。但是,在使用AFNetworking时,它尝试执行此代码($this->Session->setFlash($msg,'default',array('class'=>$class)); this->redirect($this->referer());)而不是忽略它,这会导致错误。

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