2009-09-12 1 views
0

Я пишу небольшую программу (используя Cocoa Touch), которая связывается с веб-сервисом. код для вызова веб-сервиса, является следующее:NSMutableURLRequest и пароль со специальными символами не будут работать

- (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]; 
    } 
} 

Имя пользователя и пароль должны быть в URL, и он работает в большинстве случаев, но если пароль состоит из специальных символов, как в примере " % = & = -Test2009 ", Webservice не отвечает. Если это что-то вроде «Test2009», он отлично работает. У кого-нибудь есть идея, почему и, возможно, решение для этого?

ответ

2

Специальных символы должны быть URL закодирован, то URL вы запросили,

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

..is недопустимой, а именно %= части (% используется для вылетающих символов, например %20 используется для представления пространства), так ..

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

..should изменить что-то вроде:

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

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

Это запрашивает URL-адрес https://tester:%25=&[email protected]

+2

Хотя вам все равно не нужно все это делать. Вместо этого используйте метод -connection: didReceiveAuthenticationChallenge: delegate для отправки имени пользователя и пароля; не путайте его в URL. –

2

Вы должны использовать URL-адреса безопасных символов в своей строке при создании URL-адреса, использовать этот метод NSString stringByAddingPercentEscapesUsingEncoding:, который сделает это за вас.

Смежные вопросы