2013-11-03 140 views
2

我是iOS和AFNetworking的新手。我習慣了Titanium,以及使用與JavaScript中的xhr類似的模型發佈和獲取數據的非常簡單的方法。我發送Post請求到我的服務器並取回JSON。它在Titanium中完美地工作,但我有一段時間讓它在本地工作。AFNetworking 2.0 POST請求的問題

在做了一些研究Titanium的後端之後,看起來他們正在使用ASI,我發現它很有趣。現在看來AFNetworking是另一種選擇,因爲ASI不再被更新。然而,當我發送下面的請求時,它會得到一個text/html響應,而不是JSON響應。我猜這是因爲參數以及它們如何被髮送。

在另一個StackOverflow問題上,人們需要向服務器提供標準的post變量,服務器用JSON響應,這正是我需要做的。建議是在AFHTTPClient中設置「parameterEncoding爲AFFormURLParameterEncoding」,但我不知道該怎麼做。如果有人能幫我解決這個問題,我會永遠感激。如果能幫助任何人解決這個問題,我可以提供實際的帖子地址和虛擬用戶/密碼。

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
NSDictionary *parameters = @{@"username": @"dummyusername",@"password":@"dummypassword"}; 
NSString *URLString = @"https://www.webaddress.com/index.php?ACT=71"; 
[manager POST:URLString parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> parameters){} success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"JSON: %@", responseObject); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 
+0

有一個有趣的文章[這裏](http://gavrix.wordpress.com/2013/10/16/migrating-from-afnetworking-1-x-to- afnetworking-2 /)轉換爲AFNetworking 2.0。而且,在AFHTTPRequestOperationManager中發送參數的默認方法是通過JSON,而不是通過x-www-form-urlencoded風格。但我不確定如何更改方法。 – Chris

回答

4

在AFNetworking 2.1,則可以創建一個AFHTTPRequestOperationManager作爲一個實例變量,在您的視圖控制器viewDidLoad初始化(或在一個對象中設置方法),設置請求串行器,然後使通過請求實例變量。

工作例如:

// Creation 
-(void)setup { 
    url = [NSURL URLWithString:kMediaURLString]; 

  manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url]; 
    manager.requestSerializer = [AFHTTPRequestSerializer serializer]; 
  manager.responseSerializer = [AFJSONResponseSerializer serializer]; 
} 

... 

-(void)makeRequestWithObject:(id)obj { 
    // Create your parameters 
    NSDictionary *params = @{ @"someParameter" : obj }; 

    // Create a path (relative to your manager's baseURL) 
    NSString *urlString = [NSString stringWithFormat:kCreatePath, postPath]; 

    // Post the request to urlString with params, handle success or failure 
    [manager POST:urlString 
     parameters:params 
      success:^(AFHTTPRequestOperation *operation, id success){ 
       // Do stuff on success 
      }failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
       // Do stuff on failure 
      }]; 
} 
+0

這工作得很好。服務器端也存在問題。在輸出JSON響應之後,表達式引擎試圖修改頭信息,導致PHP錯誤輸出爲text/html,並導致對應用程序中的錯誤作出響應。我能夠在服務器上解決這個問題,現在它工作的很好!再次感謝大家在stackoverflow! – Chris

0

我還沒有用過AFNetworking的方式,但我猜你的問題與服務器不知道它應該發送一個JSON響應有關。你可以將'accept'標題改爲'application/json'。

看看this AFNetworking教程,它幫助了我很多:)

-1

可以使用AFNetworking這樣。

AFHTTPClient *httpClient = [[AFHTTPClient alloc] init]; 
NSDictionary *parameter = @{@"username":@"dummyusername", @"password":@"dummypassword"}; 
[httpClient setParameterEncoding:AFJSONParameterEncoding]; 
[httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]]; 

[httpClient postPath:@"https://www.webaddress.com/index.php?ACT=71" parameters:parameter success:^(AFHTTPRequestOperation *operation, id responseObject) { 
// Print the response body in text 
BOOL *success = [[responseObject objectForKey:@"success"] boolValue]; 
NSLog(@"Response: %@",responseObject); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
[self handleConnectionError:error]; 
}]; 
+0

這是使用AFNetworking 2.0嗎?如果是的話,httpClient是一個AFHTTPRequestOperationManager? – Chris

+0

這是AFNetworking 1.0 –