2015-01-06 2 views
0

В прошлом я использовал следующий код для отправки данных из своего приложения в веб-сервис, который сохраняет данные на сервере моей компании (веб-сервис написан на asp.net).Специальные символы в запросе Webservice

- (NSArray *) callWebserviceWithPost:(NSString *)post andWithParser:(MyNSXMLParserDelegateClass *)parser 
{ 
    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:NO]; 
    NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:[NSURL URLWithString:@"http://www.example.com/mywebservices/mywebservice.aspx"]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
    [request setHTTPBody:postData]; 
    [request setTimeoutInterval:600]; 
    NSHTTPURLResponse *response = nil; 
    NSError *err = nil; 
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err]; 
    if (!responseData) 
    { 
     NSString *msg = [NSString stringWithFormat:@"Response not recieved from web service"]; 
     [Globals throwError:msg withCode:20 inMethod:_cmd onClass:[self class]]; 
     return [NSArray arrayWithObject:errorString]; 
    } 
    else 
    { 
     NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 

     if ([[responseString substringToIndex:1] isEqualToString:@"<"]) 
     { 
      // Create and init NSXMLParser object from data return by web service 
      NSXMLParser *nsXmlParser = [[NSXMLParser alloc] initWithData:responseData]; 
      [nsXmlParser setDelegate:parser]; 
      BOOL success = [nsXmlParser parse]; 
      if (success) 
      { 
       return parser.allItems; 
      } 
     } 
    } 
} 

Где пост будет выглядеть примерно так

NSString *post = @"NewUser=<?xml version=\"1.0\" encoding=\"UTF-8\"?> 
        <data> 
         <username>GeneralMike</username> 
         <status>Awesome</status> 
        </data> 
       </xml>" 

Это работало отлично подходит для всего, что я должен был сделать до сих пор.


Однако, теперь мне нужно отправить некоторые специальные символы в моих данных

...<username>"Frank"</username>... 

Я сделал некоторые исследования и discovered I can escape the special characters with certain codes. Так что этот пример станет

...<username>&quot;Frank&quot;</username>... 

Когда я отлаживать WebService проект с постом с побегами добавленных, он отлично работает. Однако, когда я пытаюсь вызвать WebService из моего приложения, я получаю сообщение об ошибке в моем ответе, говоря

Unexpected end of file has occurred. The following elements are not closed: username,data. Line 1, position .... 

Перечисляя с позиции при условии, что я обнаружил эту ошибку бросают прямо там, где & находится в первом побеге.

Я также нашел много вещей, предлагающих мне использовать stringByAddingPercentEscapesUsingEncoding или CFURLCreateStringByAddingPercentEscapes(), но каждый способ, которым я пытался их использовать, веб-служба не может распознать, что такое запрос.

Почему экраны, с которыми я связан, работают нормально, когда я помещаю их непосредственно в проект webservice, но теряюсь, когда пытаюсь отправить их из своего приложения? Что мне нужно изменить, чтобы заставить их работать?

ответ

0

Поскольку я управляю веб-сервисом и платформами, использующими его, я смог разработать собственное соглашение для обработки специальных символов. Я знаю, что для контента, который я отправляю прямо сейчас, очень маловероятно, что у меня когда-либо было бы значение, содержащее двойной знак подчеркивания, и подчеркивания кажутся законными для всего, что я видел до сих пор, поэтому я разработал систему, в которой я заклинание персонажа и окружение его подчеркивания. Поэтому у меня было бы что-то вроде

...<username>__QUOTE__Frank__QUOTE__</username>... 

в моей новой системе. Я могу искать специальные символы перед отправкой запроса из моего приложения или ответа из веб-службы и выполнять простые замены строк. Затем, как только я получу XML, найдите замены и верните их в специальные символы перед использованием данных (например, показ на экране или сохранение в базе данных).

Мне не очень нравится это решение. Я бы скорее согласился на более универсальную конвенцию. Поскольку я не могу найти эту конвенцию, если такая конвенция существует, это будет сделано пока.