【问题标题】:Send post request and map response to object向对象发送发布请求和映射响应
【发布时间】:2012-01-18 16:58:12
【问题描述】:

我是 restKit 的新手,我有几个问题要问你。我 无法理解如何使用 json/xml 将 Post 请求发送到我的网站 服务并将收到的回复映射到我的班级。谁能给 我对此有所帮助。我正在使用的代码是这样的: 在我的 applicationDelegate 我正在实例化 RKObjectManager 提供基本 URL:

RKObjectManager* manager = [RKObjectManager objectManagerWithBaseURL:@"https://example.com/services/"]; 

   // Request params in Dictionary 
    NSArray *objects = [NSArray arrayWithObjects: email, password, 
nil]; 
    NSArray *keys = [NSArray arrayWithObjects:@"username", 
@"password", nil]; 
    NSDictionary *params = [NSDictionary dictionaryWithObjects:objects 
forKeys:keys]; 
    NSLog(@"Manager: %@", [RKObjectManager 
sharedManager].description); 
    // User object Mapping 
    RKObjectMapping* userMapping = [RKObjectMapping mappingForClass: 
[User class]]; 
    [userMapping mapKeyPath:@"userName" toAttribute:@"userName"]; 
    [userMapping mapKeyPath:@"lastName" toAttribute:@"lastName"]; 
    [userMapping mapKeyPath:@"active" toAttribute:@"active"]; 
    [[RKObjectManager sharedManager].mappingProvider 
setMapping:userMapping forKeyPath:@"user"]; 
    [[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/ 
login" delegate:self]; 

当一个帖子被发送到 /login 时,服务器应该发回一个有效的 json 然后将该 json 映射到我的 User 类。

- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects: 
(NSArray*)objects { 
    RKLogInfo(@"Load collection of Articles: %@", objects); 
} 

- (void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError: 
(NSError *)error 
{ 
    NSLog(@"Objecy Loader failed: %@", error); 
} 

- (void)request:(RKRequest *)request didFailLoadWithError:(NSError 
*)error 
{ 
    NSLog(@"Request failed"); 
} 

- (void)request:(RKRequest*)request didLoadResponse: 
(RKResponse*)response { 
    if ([request isGET]) { 
        // Handling GET /foo.xml 
        if ([response isOK]) { 
            // Success! Let's take a look at the data 
            NSLog(@"Retrieved XML: %@", [response bodyAsString]); 
        } 
    } else if ([request isPOST]) { 
        // Handling POST /other.json 
        if ([response isXML]) { 
         ///NSLog(@"Seng a JSON request:! \n %@", [request 
HTTPBodyString]); 
            NSLog(@"Got a responce! \n %@", [response bodyAsString]); 
        } 
    } else if ([request isDELETE]) { 
        // Handling DELETE /missing_resource.txt 
        if ([response isNotFound]) { 
            NSLog(@"The resource path '%@' was not found.", [request 
resourcePath]); 
        } 
    } 
} 

当我执行它时,不会触发 objectLoader 方法,我的 对restkit的理解是他们应该在什么时候被调用

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/login" 
delegate:self];

被执行?任何帮助表示赞赏:)

【问题讨论】:

    标签: objective-c ios restkit object-object-mapping


    【解决方案1】:

    好吧,您甚至没有将数据发送到服务器。几天前,我写了一个sn-p解释how to post a NSDictionary (as JSON) to a server using RestKit

    【讨论】:

      【解决方案2】:

      您是否记得使用

      将 restkit 的委托设置为该用户类(或您有委托被捕获的任何地方)
      @interface User : NSObject<RKObjectLoaderDelegate>{
      }
      

      你可能做过,但值得一提的是:P

      在这一行中传递的 self 是那个类?

      [[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/ 
      login" delegate:self]; 
      

      我也认为添加映射的新方法是为帖子设置是

      [sharedManager.mappingProvider addObjectMapping:userMapping];
      [sharedManager.mappingProvider setMapping:userMapping forKeyPath:@"/somepath"];
      
      [sharedManager.mappingProvider setSerializationMapping:[userMapping inverseMapping] forClass:[User class]];
       // Must set the router up to handle posts
       [sharedManager.router routeClass:[User class] toResourcePath:@"/api/users" forMethod:RKRequestMethodPOST];
      

      再次编辑:并像这样使用加载器创建一个帖子。可能会因为你的所作所为而杀了你,但看看会不会受伤

      RKObjectLoader* loader = [RKObjectLoader loaderWithResourcePath:url objectManager:self.objectManager delegate:self.currentDelegate];
          loader.method = RKRequestMethodPOST;
          loader.sourceObject = self;
          loader.targetObject = self;  
      
          loader.serializationMIMEType = self.objectManager.serializationMIMEType;
          loader.serializationMapping = [self.objectManager.mappingProvider serializationMappingForClass:self.mappingClass];
      
          loader.objectMapping = [self.objectManager.mappingProvider objectMappingForClass:self.mappingClass];
      
          [loader send]; //<<the actual post
      

      【讨论】:

      • 是的,具有方法的类正在实现 RKObjectLoaderDelegate
      猜你喜欢
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多