这是我的问题:
我正在从 iOS 设备向我的服务器发送 base64 编码数据。但有时,数据似乎分成两个请求到达。
在设备方面,我这样做:
NSString *base64Data = [self base64forData:myData];
NSMutableURLRequest *myRequest = [NSMutableURLRequest requestWithURL:myRequestURL]; //like www.myaddress.com/myPHP.php
[myRequest setHTTPMethod:@"POST"];
[myRequest setHTTPBody:[[NSString stringWithFormat:@"mydata=%@&type=%d",base64Data] dataUsingEncoding:NSASCIIStringEncoding]];
NSError *error = nil;
NSURLResponse *response = nil;
NSData *result = [NSURLConnection sendSynchronousRequest:myRequest returningResponse:&response error:&error];
这是编码功能:
- (NSString*)base64forData:(NSData*)theData {
const uint8_t* input = (const uint8_t*)[theData bytes];
NSInteger length = [theData length];
static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
NSMutableData* data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];
uint8_t* output = (uint8_t*)data.mutableBytes;
NSInteger i,i2;
for (i=0; i < length; i += 3) {
NSInteger value = 0;
for (i2=0; i2<3; i2++) {
value <<= 8;
if (i+i2 < length) {
value |= (0xFF & input[i+i2]);
}
}
NSInteger theIndex = (i / 3) * 4;
output[theIndex + 0] = table[(value >> 18) & 0x3F];
output[theIndex + 1] = table[(value >> 12) & 0x3F];
output[theIndex + 2] = (i + 1) < length ? table[(value >> 6) & 0x3F] : '=';
output[theIndex + 3] = (i + 2) < length ? table[(value >> 0) & 0x3F] : '=';
}
return [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
}
在我的服务器端,在 myPHP.php 中,我使用 :$_REQUEST['mydata'];
和$_REQUEST['type'];
来file_get_contents('php://input');
检索我的数据。
如果出现问题,第一次,php 获取 HTTPBody 的第一部分。然后,随着请求的结束,它第二次调用。我可以看到file_get_contents('php://input');
没有完全收到我的 HTTPBody。例如,我可以mydata
在第一次通话中收到 of 的一部分,然后在mydata
with结束时收到type
。
如果我发送:
mydata=blablabla&type=totototo
我可以收到它分为
mydata=blab
labla&type=tototo
是设备端的问题吗?在base64中转换数据有问题吗?使用 NSASCIIStringEncoding 设置 HTTPBody ?特殊字符破坏了我的服务器检索到的数据?
欢迎任何帮助。