Web服务请求中的特殊字符

时间:2015-01-06 16:31:46

标签: asp.net objective-c web-services nsurlrequest

过去我一直在使用以下代码将数据从我的应用程序发送到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>&quot;Frank&quot;</username>...

当我使用添加了转义符的帖子调试我的webservice项目时,它工作正常。但是,当我尝试从我的应用程序调用Web服务时,我在回复中收到错误消息

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

使用提供的位置进行计数,我发现此错误正在&处于第一次转义中的位置。

我还发现了很多建议我需要使用stringByAddingPercentEscapesUsingEncodingCFURLCreateStringByAddingPercentEscapes()的内容,但是我尝试使用它们的方式,网络服务可以使用{{1}}或{{1}}。 t识别请求是什么。

当我将它们直接放入web服务项目时,为什么我链接的转义工作正常,但是当我尝试从我的应用程序发送它们时迷路?我需要做些什么才能让它们发挥作用?

1 个答案:

答案 0 :(得分:0)

由于我控制了web服务和使用它的平台,因此我能够开发自己的约定来处理特殊字符。我知道,对于我现在发送的内容,我不太可能拥有包含双下划线的值,并且下划线似乎对我所见过的所有内容都是合法的到目前为止,我开发了一个系统,我拼出一个字符并用下划线包围它。所以我有类似

的东西
...<username>__QUOTE__Frank__QUOTE__</username>...

在我的新系统中。我可以在从我的应用程序发送请求或从Web服务发送响应之前查找特殊字符,并执行简单的字符串替换。然后,只要收到XML,就会查找替换内容,然后在使用数据之前将其重新转换为特殊字符(例如在屏幕上显示或保存到数据库中)。

我不是特别喜欢这个解决方案。我更愿意订阅一个更普遍的公约。由于我似乎无法找到该惯例,如果存在这样的惯例,现在就可以做到。