2009-09-12 6 views
0

J'écris un petit programme (en utilisant Cocoa Touch), qui communique avec un webservice. Le code pour appeler le webservice, est la suivante:NSMutableURLRequest et un mot de passe avec des caractères spéciaux ne fonctionneront pas

- (IBAction)send:(id)sender 
{ 
    if ([number.text length] > 0) 
    { 
     [[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 
     [activityIndicator startAnimating]; 
     NSString *modded; 
     modded = [self computeNumber]; 
     NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:  [NSURL URLWithString:@"https://tester:%=&[email protected]/RPC2"]]; 
     [theRequest setHTTPMethod:@"POST"]; 
     [theRequest addValue:@"text/xml" forHTTPHeaderField:@"content-type"]; 
     [theRequest setCachePolicy:NSURLCacheStorageNotAllowed]; 
     [theRequest setTimeoutInterval:5.0]; 
     NSString* pStr = [[NSString alloc] initWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?><methodCall><methodName>samurai.SessionInitiate</methodName><params><param><value><struct><member><name>LocalUri</name><value><string></string></value></member><member><name>RemoteUri</name><value><string>sip:%@@sipgate.net</string></value></member><member><name>TOS</name><value><string>text</string></value></member><member><name>Content</name><value><string>%@</string></value></member><member><name>Schedule</name><value><string></string></value></member></struct></value></param></params></methodCall>", modded, TextView.text]; 
     NSData* pBody = [pStr dataUsingEncoding:NSUTF8StringEncoding]; 
     [theRequest setHTTPBody:pBody]; 
     NSURLConnection *theConnection = [[NSURLConnection alloc]  initWithRequest:theRequest delegate:self]; 

     if (!theConnection) 
     { 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" 
                  message:@"A Connection could not be established!" 
                  delegate:nil 
                cancelButtonTitle:@"OK" 
                otherButtonTitles: nil]; 
      [alert show]; 
      [alert release]; 
      sendButton.enabled = TRUE; 
      return; 
     } 
     [pStr release]; 
     [pBody release]; 
    } 
} 

Le nom d'utilisateur et mot de passe doivent être dans l'URL, et il fonctionne dans la plupart des cas, mais quand le mot de passe comporte des caractères spéciaux comme dans l'exemple " % = & = "Tester2009", le Webservice ne répond pas. Si c'est quelque chose comme "Test2009" cela fonctionne bien. Est-ce que quelqu'un a une idée pourquoi, et peut-être une solution pour cela?

Répondre

2

Les caractères spéciaux doivent être encodée au format URL, l'URL demandée,

https://tester:%=&[email protected]/RPC2 

invalide Le panier est, en particulier la partie %= (% est utilisé pour les caractères qui s'échappent, par exemple %20 est utilisé pour représenter un espace), donc ..

NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL: 
    [NSURL URLWithString:@"https://tester:%=&[email protected]/RPC2"]]; 

..should changer quelque chose comme:

NSString *theAddress = [NSString stringWithFormat:@"https://%@:%@@%@", 
         [@"tester" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], 
         [@"%=&=-Test2009" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], 
         @"example.com"]; 

NSURL *theURL = [NSURL URLWithString:theAddress]; 
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:theURL]; 

Ceci demande l'URL https://tester:%25=&[email protected]

+2

Bien que vous n'ayez absolument pas besoin de faire tout cela de toute façon. Au lieu de cela, utilisez la méthode -connection: didReceiveAuthenticationChallenge: delegate pour envoyer le nom d'utilisateur et le mot de passe; ne plaisante pas sur le regroupement dans l'URL. –

Questions connexes