2013-10-31 59 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