2014-06-19 2 views
0

J'utilise le kit de connexion pour me connecter et mapper les objets de highrise api. Je suis en mesure de vous connecter en utilisant /me.xml mais coincé après que pour aller chercher les autres paramètres comme people.xml, tasks.xml etc.Restkit ne pas définir l'en-tête ou les cookies

Le code de connexion:

//MYObjectManager is a class inherited from RKObjectManager. 

NSURL *url = [NSURL URLWithString:BASE_URL];  
MYObjectManager *sharedManager = [self managerWithBaseURL:url]; 
sharedManager.requestSerializationMIMEType = RKMIMETypeXML; 
[RKMIMETypeSerialization registerClass:[RKXMLReaderSerialization class] forMIMEType:RKMIMETypeXML]; 
[sharedManager setAcceptHeaderWithMIMEType:@"application/xml"]; 
[sharedManager.HTTPClient setAuthorizationHeaderWithUsername:USERNAME password:PASSWORD]; 

Une UserManager classe hérita de MYObjectManager pour l'utilisateur de charger l'utilisateur authentifié comme:

- (void) loadAuthenticatedUser:(void (^)(User *))success failure:(void (^)(RKObjectRequestOperation *, NSError *))failure { 
     RKResponseDescriptor *authenticatedUserResponseDescriptors = [RKResponseDescriptor responseDescriptorWithMapping:[MappingProvider userMapping] method:RKRequestMethodGET pathPattern:nil keyPath:@"user" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 

     [self addResponseDescriptor:authenticatedUserResponseDescriptors]; 

     [self getObjectsAtPath:@"me.xml" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
     if (success) { 
      User *currentUser = (User *)[mappingResult.array firstObject];    
      success(currentUser); 
      } 
     } failure:^(RKObjectRequestOperation *operation, NSError *error) { 
      if (failure) { 
      failure(operation, error); 
     } 
    }]; 
} 

Cela fonctionne et me renvoie le jeton. Mais maintenant, avec l'utilisation de ce jeton, je ne peux pas faire d'autres requêtes (il semblerait que certains cookies ne soient pas définis par le kit de relance, peut-être) ContactManager a également hérité de MYObjectManager.

Dans le bloc de réussite de l'utilisateur que je fais demande de people.xml comme:

[[UserManager sharedManager] loadAuthenticatedUser:^(User *user) { 
    self.apiToken = user.utoken; 
    if(self.apiToken){ 
     // [[ContactManager sharedManager].HTTPClient setDefaultHeader:@"Authorization" value: [NSString stringWithFormat:@"Basic %@", self.apiToken]]; 

     [[ContactManager sharedManager].HTTPClient setAuthorizationHeaderWithToken:[NSString stringWithFormat:@"Basic %@", self.apiToken]]; 

     [[ContactManager sharedManager] loadContacts:^(ContactList *contacts) { 
      NSLog(@"contacts is: %@", contacts); 
     }failure:^(RKObjectRequestOperation *operation, NSError *error){ 
      NSLog(@"contacts error occured: %@", error); 
     }]; 
    } 
} failure:^(RKObjectRequestOperation *operation, NSError *error) { 
    NSLog(@"login error occured: %@", error); 
}]; 

Mais cela donne une erreur de 401 non autorisé. Que manque-t-il? Toute aide est appréciée.

EDIT - Demande et reponses sont les suivantes:

tête de demande envoyée pour la connexion

restkit.network:RKObjectRequestOperation.m:148 GET 'https://dws10.highrisehq.com/me.xml': 
request.headers={ 
    Accept = "application/xml"; 
    "Accept-Language" = "en;q=1, fr;q=0.9, de;q=0.8, zh-Hans;q=0.7, zh-Hant;q=0.6, ja;q=0.5"; 
    Authorization = "Basic ZGlwaWthLmFiYmFkOmRpcGlrYTEyMw=="; 
    "User-Agent" = "TemplateApp/1.0 (iPhone Simulator; iOS 7.0.3; Scale/2.00)"; 
} 

tête de réponse recieved:

restkit.network:RKObjectRequestOperation.m:218 GET 'https://dws10.highrisehq.com/me.xml' (200 OK/1 objects) [request=27.9217s mapping=0.0433s total=28.4159s]: 
response.headers={ 
    "Cache-Control" = "private, max-age=0, must-revalidate"; 
    Connection = "keep-alive"; 
    "Content-Length" = 447; 
    "Content-Type" = "application/xml; charset=utf-8"; 
    Date = "Thu, 19 Jun 2014 13:41:48 GMT"; 
    Etag = "\"6315ed097b16e809367d5e5243e719ea\""; 
    Server = nginx; 
    Status = "304 Not Modified"; 
    "Strict-Transport-Security" = "max-age=31536000"; 
    "Timing-Allow-Origin" = "*"; 
    "X-Frame-Options" = SAMEORIGIN; 
    "X-Request-Id" = ee68caa2005ffad955f12175a619b0f3; 
    "X-Runtime" = 94; 
    "X-Throttle-Count" = 1; 
    "X-Throttle-Horizon" = "2014-06-19T13:41:50Z"; 
    "X-Throttle-Max" = 500; 
} 

response.body=<?xml version="1.0" encoding="UTF-8"?> 
<user> 
    <created-at type="datetime">2014-06-19T09:39:44Z</created-at> 
    <id type="integer">1045054</id> 
    <token>my token value here</token> 
    <updated-at type="datetime">2014-06-19T09:39:44Z</updated-at> 
    <dropbox>[email protected]</dropbox> 
    <name>Dipika Abbad</name> 
    <email-address>[email protected]</email-address> 
    <admin type="boolean">true</admin> 
</user> 

tête de demande pour les personnes i envoyais est:

restkit.network:RKObjectRequestOperation.m:148 GET 'https://dws10.highrisehq.com/people.xml': 
request.headers={ 
    Accept = "application/xml"; 
    "Accept-Language" = "en;q=1, fr;q=0.9, de;q=0.8, zh-Hans;q=0.7, zh-Hant;q=0.6, ja;q=0.5"; 
    Authorization = "Basic <my api token from above response body>"; 
    "User-Agent" = "TemplateApp/1.0 (iPhone Simulator; iOS 7.0.3; Scale/2.00)"; 
} 

réponse recieved:

response.body=HTTP Basic: Access denied. 
2014-06-19 19:19:31.797 TemplateApp[3403:a0b] contacts error occured: Error Domain=org.restkit.RestKit.ErrorDomain Code=-1011 "Expected status code in (200-299), got 401" UserInfo=0xbd6f8d0 {NSLocalizedRecoverySuggestion=HTTP Basic: Access denied. 
, AFNetworkingOperationFailingURLRequestErrorKey=<NSMutableURLRequest: 0xb9e3b60> { URL: https://dws10.highrisehq.com/people.xml }, NSErrorFailingURLKey=https://dws10.highrisehq.com/people.xml, NSLocalizedDescription=Expected status code in (200-299), got 401, AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0xbd8b0a0> { URL: https://dws10.highrisehq.com/people.xml } { status code: 401, headers { 
    "Cache-Control" = "no-cache"; 
    Connection = "keep-alive"; 
    "Content-Length" = 27; 
    "Content-Type" = "text/html; charset=utf-8"; 
    Date = "Thu, 19 Jun 2014 13:49:30 GMT"; 
    Server = nginx; 
    Status = "401 Unauthorized"; 
    "Strict-Transport-Security" = "max-age=31536000"; 
    "Www-Authenticate" = "Basic realm=\"Application\""; 
    "X-Frame-Options" = SAMEORIGIN; 
    "X-Request-Id" = 9a420bfa16fa4620eeb9469e5ad7345d; 
    "X-Runtime" = 5; 
    "X-Throttle-Count" = 1; 
    "X-Throttle-Horizon" = "2014-06-19T13:49:40Z"; 
    "X-Throttle-Max" = 500; 
} }} 
+0

Afficher les en-têtes que vous obtenez, et vous devez savoir ce que le serveur attend si vous voulez être en mesure de le faire correspondre. – Wain

Répondre

0

Problème résolu. Il doit définir Username comme le jeton et le mot de passe le factice.

0

Mettez ce qui suit dans votre délégué de l'application:

RKLogConfigureByName("RestKit/Network", RKLogLevelTrace); 
RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace); 

Et voir la console pour examiner les demandes et vérifier si vous configurez les en-têtes corrects

+0

Hey ça m'a beaucoup aidé, merci! Chose est que je n'ai aucune idée claire de ce dont il a besoin dans l'en-tête. J'ai essayé de passer juste l'en-tête d'autorisation au format - 1) de base 2) porteur 3) jeton mais aucun travaillé. – Dips

+0

Vous devriez avoir un en-tête comme: "Autorisation: Basic XXXTOKENXXX" –

+0

Cette réponse est actuellement un commentaire et a besoin de plus de détails. – Wain

Questions connexes