Цель C: HTTP-запрос POST получает Unescaped

Я использую NSMutableURLRequest для отправки (синхронного) запроса POST в веб-службу. Тело запроса содержит комбинацию XML и JSON. Что-то типа :

<element>
 <element 2>
 <![CDATA[
  {"jsondata1":{"datafield1":"data1"},
   "jsondata2":"some data"
  }
 ]]>
 </element 2>
</element>

строка JSON экранирована (с использованием escape() в Javascript)

Когда я получаю запрос на другом конце, я замечаю, что все экранированные символы не экранированы!!

Кто-нибудь может сказать мне, почему это происходит? И как я могу предотвратить это?

Вот код, который я использую для отправки запроса:

NSURL *url = [NSURL URLWithString:@"https://my-webservice.com/something.do"];
NSData *xmlResponseDataSave;
NSMutableURLRequest *req = [[NSMutableURLRequest alloc] initWithURL:url];
NSString *msgLength = [NSString stringWithFormat:@"%d",[xmlRequestString length]];
[req addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[req addValue:msgLength forHTTPHeaderField:@"Content-Length"];
[req setHTTPMethod:@"POST"];
NSData *saveData=[xmlRequestString dataUsingEncoding:NSUTF8StringEncoding];
[req setHTTPBody:saveData];

NSError *error=nil;

NSURLResponse *resp=[[NSURLResponse alloc] init];
xmlResponseData=[NSURLConnection sendSynchronousRequest:req returningResponse:&resp error:&error];
NSString *xmlResponseString=[[NSString alloc] initWithData:xmlResponseData encoding:NSUTF8StringEncoding];

Обратите внимание: я не могу внести какие-либо изменения в xml или веб-службу. Я могу изменить только объектный код c.


person Shayan RC    schedule 04.03.2013    source источник
comment
О каком побеге вы говорите?   -  person trojanfoe    schedule 04.03.2013
comment
@trojanfoe Чтобы быть точным, строка JSON экранируется с помощью функции javascript escape() для кодирования специальных символов.   -  person Shayan RC    schedule 04.03.2013
comment
Почему? Разве вы не можете поместить почти все, что вам нравится, в раздел CDATA?   -  person trojanfoe    schedule 04.03.2013
comment
@trojanfoe, как я уже сказал: у меня нет контроля над xml или вызываемой веб-службой. Мне просто нужно убедиться, что экранированные символы не экранируются при отправке...   -  person Shayan RC    schedule 04.03.2013


Ответы (1)


После множества проб и ошибок единственное решение, которое я смог придумать, - это использовать строку, используемую в теле запроса, перед его отправкой (поскольку при отправке она не будет экранирована):

xmlRequestString=[xmlRequestString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSData *saveData=[xmlRequestString dataUsingEncoding:NSUTF8StringEncoding];

Хотя это не исправление в прямом смысле, а просто обходной путь. Но это работает для меня (пока).

Я все еще меньше разбираюсь в первопричине проблемы и я все еще ищу более элегантное решение.

person Shayan RC    schedule 06.03.2013