В прошлом я использовал следующий код для отправки данных из своего приложения в веб-сервис, который сохраняет данные на сервере моей компании (веб-сервис написан на 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>"Frank"</username>...
Когда я отлаживать WebService проект с постом с побегами добавленных, он отлично работает. Однако, когда я пытаюсь вызвать WebService из моего приложения, я получаю сообщение об ошибке в моем ответе, говоря
Unexpected end of file has occurred. The following elements are not closed: username,data. Line 1, position ....
Перечисляя с позиции при условии, что я обнаружил эту ошибку бросают прямо там, где &
находится в первом побеге.
Я также нашел много вещей, предлагающих мне использовать stringByAddingPercentEscapesUsingEncoding
или CFURLCreateStringByAddingPercentEscapes()
, но каждый способ, которым я пытался их использовать, веб-служба не может распознать, что такое запрос.
Почему экраны, с которыми я связан, работают нормально, когда я помещаю их непосредственно в проект webservice, но теряюсь, когда пытаюсь отправить их из своего приложения? Что мне нужно изменить, чтобы заставить их работать?