1

restKit を使用して POST リクエストを送信しようとしていますが、できません。

私のコードは次のようなものです:

    NSString *urlAddTask;
    urlAddTask = [NSString stringWithFormat:@"some URL"];

    RKObjectManager* mgr = [RKObjectManager sharedManager];

    mgr.serializationMIMEType = RKMIMETypeJSON;

    RKObjectMapping* mapping = [RKObjectMapping mappingForClass:[NSMutableDictionary class]];
    [mapping mapKeyPath: @"name"       toAttribute:@"name"         ];

    RKObjectMapping* mappingForSerialization = [mapping inverseMapping];

    [mgr.mappingProvider setSerializationMapping:mappingForSerialization forClass:[NSManagedObject class]];

    [mgr.router routeClass:[NSManagedObject class] toResourcePath:urlAddTask forMethod:RKRequestMethodPOST];

    Task *t=[[Task alloc]init];
    t.name=@"One name";

    [[RKObjectManager sharedManager].router routeClass:[Task class] toResourcePath:@"/tasks" forMethod:RKRequestMethodPOST];

    [mgr postObject:t delegate:nil/*self*/];

このコードを実行すると、次のエラーが発生します。

    *** Assertion failure in -[RKObjectLoader prepareURLRequest], /myAppRoute/Libraries/RestKit/Code/ObjectMapping/RKObjectLoader.m:304
2013-02-14 17:12:25.202 Aplication[1929:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'You must provide a serialization mapping for objects of type 'Task''

悪いことをたくさんしていると思います。POST の作成方法に関する良い例を探していますが、リクエストを実行するのに役立つ投稿が見つかりませんでした。

これを行う方法についての良い例を教えてください。

ありがとうございました!


アップデート

おっしゃるとおり連載線を更新しました。次に、このエラーが発生しました:

2013-02-15 10:16:45.009 myApp[829:c07] W restkit.network:RKObjectLoader.m:241 Unable to find parser for MIME Type 'text/html'
2013-02-15 10:16:45.009 myApp[829:c07] W restkit.network:RKObjectLoader.m:262 Encountered unexpected response with status code: 200 (MIME Type: text/html)

次に、シリアル化の MIMEType を RKMIMETypeJSON から RKMIMETypeXML に次の行で変更しようとしました。

mgr.serializationMIMEType = RKMIMETypeXML;

そして今、エラーは次のようなものです:

2013-02-15 10:20:01.315 myApp[873:c07] -[RKXMLParserLibXML stringFromObject:error:]: unrecognized selector sent to instance 0x86ae910
2013-02-15 10:20:01.316 myApp[873:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[RKXMLParserLibXML stringFromObject:error:]: unrecognized selector sent to instance 0x86ae910'

私が言ったように、私は多くの悪いことをしていると確信しています. 私はそれでとても迷っています。

ありがとう!!

4

2 に答える 2

1

他のエラーについて話すことはできませんが、例外メッセージが示すように、Taskクラスのシリアライゼーション マッピングがありません。きっと変わるはずです

[mgr.mappingProvider setSerializationMapping:mappingForSerialization forClass:[NSManagedObject class]];

[mgr.mappingProvider setSerializationMapping:mappingForSerialization forClass:[Task class]];
于 2013-02-14T16:25:20.607 に答える
1

さて、あなたのコードは少し混乱しているようで、いくつか間違っています。

// Set url of webservice
NSURL *taskURL = [NSURL URLWithString:@"http://demopath.com"];   

// Set object manager with base url
RKObjectManager *objectManager = [[RKObjectManager alloc] init];
objectManager = [RKObjectManager managerWithBaseURL:taskURL];

// Set accepted data type
[objectManager setSerializationMIMEType:@"application/json"];
[objectManager setAcceptMIMEType:@"application/json"];
// [objectManager.client setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; // Optional

// Set store 
RKManagedObjectStore* objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:@"yourFileName.xml"];
objectManager.objectStore = objectStore;

// Set route
[objectManager.router routeClass:[Task class] toResourcePath:@"/tasks" forMethod:RKRequestMethodPOST]; // Set path for posting objects

// Set mapping
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Task class]];
[mapping mapKeyKath:@"nameServer" toAttribute:@"nameClient"]; // If webservice and local attributes got different names, first is the receiving one, second the local one

// Init your new object
Task *task = [Task new];
task.nameClient = @"Hello world";

// Send post request to webservice
[objectManager.mappingProvider setSerializationMapping:[mapping inverseMapping] forClass:[Task class]]; // Set inverse mapping on post reques   
[objectManager postObject:task usingBlock:^(RKObjectLoader *loader)
 {
     loader.backgroundPolicy = RKRequestBackgroundPolicyContinue; // Continues request when app is moving to background
     // loader.resourcePath = @"/tasks"; // // Optional, because it has been configured in the routing
     // loader.objectMapping = [objectManager.mappingProvider objectMappingForClass:[Task class]]; // Optional, because it has been configured before
     loader.delegate = self;

     loader.onDidLoadObjects = ^(NSArray *objects) {
      NSLog(@"It Worked: %@", objects);
  };
     loader.onDidFailWithError = ^(NSError *error) {
      NSLog(@"It Failed: %@", error);
  };
 }];

Web サービスが返さ200れ、MIME タイプtext/htmlが表示されると、承認が必要な Web サービスを呼び出そうとしているようです (Web サービスがログイン ページを返すため)。リクエストに承認が必要な場合は、投稿リクエストの前に次のメソッドを追加します。

// Set authorization
objectManager.client.username = @"yourUsername";
objectManager.client.password = @"yourPassword";
objectManager.client.authenticationType = RKRequestAuthenticationTypeHTTPBasic; // Change like you need it

物事がうまくいくことを願っています。

于 2013-02-15T20:32:25.690 に答える