2013-10-31 61 views
1

我正在使用Rest Kit 0.20.3和Xcode 5來創建應用程序。我已經完成了GET請求,並從服務器獲取了2個對象。現在我創建了一個具有兩個文本字段的視圖來輸入playerName和playerAge。 我試過下面的代碼來發布新的球員到服務器,但它不工作:RestKit如何發佈對象

AddPlayerViewController.h

#import <RestKit/RestKit.h> 
#import "Player.h" 

@interface AddPlayerViewController : UIViewController 

@property (nonatomic, strong) Player *addedPlayer; 

@property (weak, nonatomic) IBOutlet UITextField *playerNameTxt; 
@property (weak, nonatomic) IBOutlet UITextField *playerAgeTxt; 

- (IBAction)save:(id)sender; 
@end 

AddPlayerViewController.m

@implementation AddPlayerViewController 

- (IBAction)save:(id)sender { 

    [self postObject]; 
} 

-(void)postObject{ 

    [[RKObjectManager sharedManager] postObject:addedPlayer path:@"/players.json" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
     addedPlayer.playerName = playerNameTxt.text; 
     NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc]init]; 
     [numberFormatter setNumberStyle:NSNumberFormatterNoStyle]; 
     addedPlayer.playerAge = [numberFormatter numberFromString:[NSString stringWithFormat:@"%@",playerAgeTxt.text]]; 
    } failure:^(RKObjectRequestOperation *operation, NSError *error) { 
    }]; 
} 
@end 

,我發現了以下errror:

Expected status code in (200), got 422, AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0xaf67e60> { URL: http://localhost:3000/players.json} 

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    RKLogConfigureByName("RestKit", RKLogLevelWarning); 
    RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace); 
    RKLogConfigureByName("RestKit/Network", RKLogLevelTrace); 

    RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://192.168.1.3:3010"]]; 

    RKObjectMapping *playerMapping = [RKObjectMapping mappingForClass:[Player class]]; 

    [playerMapping addAttributeMappingsFromDictionary:@{@"id": @"playerID", 
                 @"name": @"playerName", 
                 @"age" : @"playerAge", 
                 @"created_at": @"createdAt", 
                 @"updated_at": @"updatedAt"}]; 



    RKResponseDescriptor *responseDesc = [RKResponseDescriptor responseDescriptorWithMapping:playerMapping method:RKRequestMethodAny pathPattern:@"/players.json" keyPath:nil statusCodes:[NSIndexSet indexSetWithIndex:200]]; 

    [objectManager addResponseDescriptor:responseDesc]; 


    RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[playerMapping inverseMapping] objectClass:[Player class] rootKeyPath:@"/players.json" method:RKRequestMethodPOST]; 

    [objectManager addRequestDescriptor:requestDescriptor]; 
    return YES; 
} 

Player.h

@interface Player : NSObject 

@property (nonatomic,strong) NSNumber *playerID; 
@property (nonatomic,strong) NSString *playerName; 
@property (nonatomic,strong) NSNumber *playerAge; 
@property (nonatomic,strong) NSDate *createdAt; 
@property (nonatomic,strong) NSDate *updatedAt; 

@end 

在服務器端,我得到這樣的:

Started POST "/players.json" for 192.168.1.3 at 2013-11-01 20:01:34 +0530 
Processing by PlayersController#create as JSON 
    Parameters: {"/players.json"=>{"age"=>"40", "name"=>"sachin"}} 
Completed 400 Bad Request in 0ms 

ActionController::ParameterMissing (param not found: player): 
    app/controllers/players_controller.rb:73:in `player_params' 
    app/controllers/players_controller.rb:28:in `create' 
+1

你有沒有加入請求描述的播放器?確保你發佈的對象不是零。 – OMK

+0

RKRequestDescriptor * requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[playerMapping inverseMapping] objectClass:[Player class] rootKeyPath:@「/ players.json」method:RKRequestMethodPOST];這是我的AppDelegate.m文件中的播放器的請求描述符方法 [objectManager addRequestDescriptor:requestDescriptor]; – Amaresh

+0

在restkit中去RKObjectManager類, - (id)mergedParametersWithObject:(id)object ..這個方法創建你的請求JSON。嘗試調試它。 – OMK

回答

2

它看起來像你的服務器要求與 「玩家」

的ActionController :: ParameterMissing對象(PARAM未發現:球員):

和你逝去「/players.json」

參數:{ 「/players.json"=>{"age"=>"40」, 「名」=> 「薩欽」}}

試着改變你的帖子路徑只是「玩家」 在Xcode

[[RKObjectManager sharedManager] postObject:addedPlayer path:@"player" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 

RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[playerMapping inverseMapping] objectClass:[Player class] rootKeyPath:@"player" method:RKRequestMethodPOST]; 
+0

它工作並從服務器獲得插入語句,但在我的應用程序中顯示以下錯誤:(200)中的預期狀態代碼,得到201 ...但是,當我刷新我的表視圖我得到更新。 – Amaresh

+0

那是因爲201是成功POST時的狀態代碼,http://en.wikipedia.org/wiki/List_of_HTTP_status_codes您需要在post方法的'success'塊中添加表刷新行 – ndomin

+0

U mean這一個:'[self.refreshControl beginRefreshing]',我的'[self.tableView reloadData]'方法在post方法的成功塊中。 – Amaresh

1

我建議你要做到這一點:

addedPlayer.playerName = playerNameTxt.text; 

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc]init]; 
[numberFormatter setNumberStyle:NSNumberFormatterNoStyle]; 
addedPlayer.playerAge = [numberFormatter numberFromString:[NSString stringWithFormat:@"%@",playerAgeTxt.text]]; 

[[RKObjectManager sharedManager] postObject:addedPlayer path:@"/players.json" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
    NSLog(@"Yay - life is great!"); 
} failure:^(RKObjectRequestOperation *operation, NSError *error) { 
    NSLog(@"Bum: %@", error); 
}]; 

從你更新的日誌:

RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[playerMapping inverseMapping] objectClass:[Player class] rootKeyPath:@"player" method:RKRequestMethodPOST]; 
+0

我已經更新了我的問題。請看看 – Amaresh

+0

你試過我的建議嗎?發生了什麼? – Wain

+0

你可能應該從你的請求描述符中刪除'@「/ players.json」'。 – Wain