iPhone - '&'时的奇怪行为包含在HTTP请求正文中

时间:2012-02-24 13:04:38

标签: iphone xml http-post nsurlconnection

我遇到了一个与从我的iPhone应用程序发送POST请求相关的非常奇怪的问题。

应用需要将HTTP帖子数据发送到第三方服务。请求是XML,它将获得XML响应。这是我发送请求的代码:

-(void)sendRequest:(NSString *)aRequest
{
    //aRequest parameter contains the XML string to send.
    //this string is already entity-encoded
    isDataRequest = NO;
    //the following line will created string REQUEST=<myxml>
    NSString *httpBody =  [NSString stringWithFormat:@"%@=%@",requestString,aRequest];
    //I'm not sure what this next string is doing, frankly, as I didn't write this code initially
    httpBody = [(NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)httpBody, NULL, CFSTR("+"), kCFStringEncodingUTF8) autorelease];   
    NSData *aData = [httpBody dataUsingEncoding:NSUTF8StringEncoding];
    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:kOOURLRequest]] autorelease]; 
    [request setHTTPBody:aData];
    [request setHTTPMethod:@"POST"];
    self.feedURLConnection = [[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];
}

只要请求XML不包含&符号(例如,此XML请求),这就非常有效:

<?xml version="1.0"?>
<request type="search" group="0" language="en" version="2.5.2">
    <auth>
        <serial>623E1579-AC18-571B-9022-3659764542E7</serial>
    </auth>
    <data>
        <location>
            <lattitude>51.528536</lattitude>
            <longtitude>-0.108865</longtitude>
        </location>
        <search>archive</search>
    </data>
</request>
按预期发送

,并按预期收到正确的响应。

但是,当请求包含&个字符时(特别是在“搜索”元素中) - 就像这样:

<?xml version="1.0"?>
<request type="search" group="0" language="en" version="2.5.2">
    <auth>
        <serial>623E1579-AC18-571B-9022-3659764542E7</serial>
    </auth>
    <data>
        <location>
            <lattitude>51.528536</lattitude>
            <longtitude>-0.108865</longtitude>
        </location>
        <search>&amp; archive</search>
    </data>
</request>

只有&个字符的所有内容都会发送到服务器。服务器似乎没有收到超出此角色的任何内容。请注意,我在Android应用程序中使用了几乎相同的代码,一切正常,因此在服务器上不是问题。

我非常感谢任何想法如何解决这个问题!

1 个答案:

答案 0 :(得分:0)

感谢Zaph的评论,我终于对它进行了分类。我使用WireShark查看实际发送到服务器的内容,发现请求未完全编码。在最终的HTTP正文中,实际符号&存在(&amp;的一部分)。这在服务器端自然不能很好地工作,因为它收到了类似的东西:

REQUEST=first_half_of_request&amp;second_half_of_request

当服务器解码POST变量时,&被视为变量的分隔符,因此REQUEST变量仅设置为first_half_of_request - 一切都达到& char。

解决方案非常简单。在行

httpBody = [(NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)httpBody, NULL, CFSTR("+"), kCFStringEncodingUTF8) autorelease];

CFSTR("+")替换为CFSTR("+&")以编码&。现在,结合实体编码(&amp; &),导致正确的数据被发送到服务器并收到正确的响应。