我正在使用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'
你有沒有加入請求描述的播放器?確保你發佈的對象不是零。 – OMK
RKRequestDescriptor * requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[playerMapping inverseMapping] objectClass:[Player class] rootKeyPath:@「/ players.json」method:RKRequestMethodPOST];這是我的AppDelegate.m文件中的播放器的請求描述符方法 [objectManager addRequestDescriptor:requestDescriptor]; – Amaresh
在restkit中去RKObjectManager類, - (id)mergedParametersWithObject:(id)object ..這個方法創建你的請求JSON。嘗試調試它。 – OMK