我需要通过SOAP请求与服务器通信并获得响应。我有很好的方法,用参数创建XML请求,将其转换为NSMutableURLRequest并使用NSURLConnection发送。所有这些工作正常,所以我将跳过这部分代码。我的服务器是一种Magento商店,所以我收到不同数量的数据取决于我使用的请求。当我得到会话ID之类的简短回复时,一切都很完美,但是当响应时间较长时(例如国家列表),我的数据会以某种方式丢失。我通过比较didReceiveResponse和didReceiveData
中的数据长度来检查它- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
self.expectedLength = response.expectedContentLength;
self.downloadedLength = 0;
[receivedData setLength:0];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSLog(@"Data recived");
self.downloadedLength = self.downloadedLength + [data length];
[receivedData appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
if (self.downloadedLength == self.expectedLength) {
NSLog(@"correctly downloaded");
}
else{
NSLog(@"sizes don't match");
}
str = [[NSString alloc] initWithBytes:[receivedData bytes] length:[receivedData length] encoding:NSISOLatin1StringEncoding];
NSData *tmp_Data = [[NSData alloc] initWithData:[str dataUsingEncoding:NSISOLatin1StringEncoding allowLossyConversion:YES]];
parser = [[SYXmlParser alloc]initWithData:tmp_Data];
[parser startParser];
if([parser theDataArray] != nil && [[parser theDataArray]count] != 0)
{
resultArray = [[NSMutableArray alloc]initWithArray:[parser theDataArray]];
[self performSelectorOnMainThread:@selector(loadFinished) withObject:nil waitUntilDone:YES];
}
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}
当响应很长时,我得到了切割XML并且我的比较返回“大小不匹配”。 XML并没有明确地削减一半,但是文本中间缺少数据,就像一些字符缺失一样。这个问题每次都以相同的方式在同一个地方重复,所以它不是随机的。我尝试使用AFNetworking来解决这个问题,但我认为我无法正确使用它来处理这个SOAP请求。我会感激每一个能解决这个问题的主张。
编辑:
我用过这个查尔斯,但是和xcode有同样的问题。当我打开响应选项卡和SOAP选项卡时,响应为空,在XML选项卡上有一个错误,Charles无法解析此接收的数据,但在概述选项卡中,响应大小为4666字节。这是否意味着服务器给出了错误的响应?我无法相信它,因为它的商业服务器Magento与许多其他语言一起使用并且有效。