2013-06-01 83 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