J'essaie de me connecter à http://cmis.demo.nuxeo.org/nuxeo/atom/cmis/ avec NSURLConnection
. Ce service Web de démonstration est documented pour nécessiter une authentification (connexion: Administrateur/mot de passe: Administrateur).NSURLConnection n'utilise pas les informations d'identification par défaut
Modifier: Ce service Web envoie maintenant un défi d'authentification, il n'était pas au moment où la question a été posée.
Ce service Web n'a pas envoyer une demande d'authentification, je ne peux pas utiliser la méthode déléguée connection:didReceiveAuthenticationChallenge:
. Au lieu de cela, j'ai défini une valeur par défaut NSURLCredential
dans le stockage des informations d'identification partagées. Malheureusement, ce droit d'accès par défaut n'est pas utilisé par NSURLConnection
.
Voici mon code (en utilisant ARC, testé sur iOS 5):
@implementation ViewController
{
NSMutableData *responseData;
}
- (IBAction) connect:(id)sender
{
NSString *user = @"Administrator";
NSString *password = @"Administrator";
NSURL *nuxeoURL = [NSURL URLWithString:@"http://cmis.demo.nuxeo.org/nuxeo/atom/cmis/"];
NSURLCredential *credential = [NSURLCredential credentialWithUser:user password:password persistence:NSURLCredentialPersistenceForSession];
NSString *host = [nuxeoURL host];
NSNumber *port = [nuxeoURL port];
NSString *protocol = [nuxeoURL scheme];
NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc] initWithHost:host port:[port integerValue] protocol:protocol realm:nil authenticationMethod:NSURLAuthenticationMethodHTTPBasic];
[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:credential forProtectionSpace:protectionSpace];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:nuxeoURL];
BOOL manuallyAddAuthorizationHeader = NO;
if (manuallyAddAuthorizationHeader)
{
NSData *authoritazion = [[NSString stringWithFormat:@"%@:%@", user, password] dataUsingEncoding:NSUTF8StringEncoding];
NSString *basic = [NSString stringWithFormat:@"Basic %@", [authoritazion performSelector:@selector(base64Encoding)]];
[request setValue:basic forHTTPHeaderField:@"Authorization"];
}
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];
}
- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
responseData = [NSMutableData data];
}
- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[responseData appendData:data];
}
- (void) connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"connectionDidFinishLoading:%@", connection);
NSLog(@"%@", [[NSString alloc] initWithData:responseData encoding:NSISOLatin1StringEncoding]);
}
- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"connection:%@ didFailWithError:%@", connection, error);
}
@end
Depuis les informations d'identification par défaut n'est pas utilisé, je reçois html (page de connexion) au lieu de XML. Si je définis la variable manuallyAddAuthorizationHeader
sur YES
, l'autorisation fonctionne et je reçois le code XML.
Ma question est: pourquoi est-ce que NSURLConnection
ne fonctionne pas automatiquement utilise la valeur par défaut NSURLCredential
?
J'ai explicitement créé un 'NSURLProtectionSpace' avec' authenticationMethod: NSURLAuthenticationMethodHTTPBasic', donc je pensais qu'il faudrait maintenant quelle méthode utiliser. – 0xced