过去我一直在使用以下代码将数据从我的应用程序发送到Web服务,该服务将数据保存在我公司的服务器上(web服务是用asp.net编写的)。
- (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项目时,它工作正常。但是,当我尝试从我的应用程序调用Web服务时,我在回复中收到错误消息
Unexpected end of file has occurred. The following elements are not closed: username,data. Line 1, position ....
使用提供的位置进行计数,我发现此错误正在&
处于第一次转义中的位置。
我还发现了很多建议我需要使用stringByAddingPercentEscapesUsingEncoding
或CFURLCreateStringByAddingPercentEscapes()
的内容,但是我尝试使用它们的方式,网络服务可以使用{{1}}或{{1}}。 t识别请求是什么。
当我将它们直接放入web服务项目时,为什么我链接的转义工作正常,但是当我尝试从我的应用程序发送它们时迷路?我需要做些什么才能让它们发挥作用?
答案 0 :(得分:0)
由于我控制了web服务和使用它的平台,因此我能够开发自己的约定来处理特殊字符。我知道,对于我现在发送的内容,我不太可能拥有包含双下划线的值,并且下划线似乎对我所见过的所有内容都是合法的到目前为止,我开发了一个系统,我拼出一个字符并用下划线包围它。所以我有类似
的东西...<username>__QUOTE__Frank__QUOTE__</username>...
在我的新系统中。我可以在从我的应用程序发送请求或从Web服务发送响应之前查找特殊字符,并执行简单的字符串替换。然后,只要收到XML,就会查找替换内容,然后在使用数据之前将其重新转换为特殊字符(例如在屏幕上显示或保存到数据库中)。
我不是特别喜欢这个解决方案。我更愿意订阅一个更普遍的公约。由于我似乎无法找到该惯例,如果存在这样的惯例,现在就可以做到。