防止Restkit添加转义字符?

时间:2015-03-28 13:59:38

标签: ios json base64 restkit

我正在尝试使用base64编码对图像进行编码并将其传递给JSON,以生成JSON请求并调用RESTful API我正在使用RestKit。

我在日志中看到的是RestKit将转义字符添加到编码图像,这阻止了服务器端有效解码图像并失败。

我想知道什么是阻止RestKit添加转义字符的最佳选择

下面是示例

VpT\/X8WWDCpj1XBpJ1zPBDuwLHLnpCZgnmLX3EXaffi0p7NklAPgO7HZsmxzC\/XITc\/K4iwRSG

可以看到字符串中添加了斜杠(\/)。

以下是我用于编码字符串

的代码
NSData *originalPhoto = UIImagePNGRepresentation([UIImage imageNamed:@"Time_Icon.png"]);
NSString *base64PhotoString = [Base64 encode:originalPhoto];

Base64.m如下

+ (NSString*) encode:(const uint8_t*) input length:(NSInteger) length {
    NSMutableData* data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];
    uint8_t* output = (uint8_t*)data.mutableBytes;

    for (NSInteger i = 0; i < length; i += 3) {
        NSInteger value = 0;
        for (NSInteger j = i; j < (i + 3); j++) {
            value <<= 8;

            if (j < length) {
                value |= (0xFF & input[j]);
            }
        }

        NSInteger index = (i / 3) * 4;
        output[index + 0] =                    encodingTable[(value >> 18) & 0x3F];
        output[index + 1] =                    encodingTable[(value >> 12) & 0x3F];
        output[index + 2] = (i + 1) < length ? encodingTable[(value >> 6)  & 0x3F] : '=';
        output[index + 3] = (i + 2) < length ? encodingTable[(value >> 0)  & 0x3F] : '=';
    }

    return [[[NSString alloc] initWithData:data
                                  encoding:NSASCIIStringEncoding] autorelease];
}


+ (NSString*) encode:(NSData*) rawBytes {
    return [self encode:(const uint8_t*) rawBytes.bytes length:rawBytes.length];
}

我将此编码字符串作为字符串传递给RestKit请求

3 个答案:

答案 0 :(得分:0)

如果我没有错,你会被困在通过restkit发送图像到服务器。我的朋友尝试使用multipart。

在Restkit v0.20.3中几乎没有变化。在这里,我通过RkObjectManager实例为多部分帖子添加代码片段。

NSString *strTextToPost = self.txtViewForPost.text;
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    mediaType ? [params setObject:mediaType forKey:@"MEDIA_TYPE"] : @"";
    strTextToPost ? [params setObject:strTextToPost forKey:@"POST_TEXT"] : @"" ;

    NSMutableURLRequest *request = [[AppDelegate appDelegate].rkomForPost multipartFormRequestWithObject:nil method:RKRequestMethodPOST path:strPath parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        [formData appendPartWithFileData:contentData
                                    name:@"FILE"
                                fileName:fileName
                                mimeType:fileType];
    }];

    RKObjectRequestOperation *operation = [[AppDelegate appDelegate].rkomForPost objectRequestOperationWithRequest:request success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
        [RSActivityIndicator hideIndicator];
        NSLog(@"%@",operation.HTTPRequestOperation.responseString);
    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
        [RSActivityIndicator hideIndicator];
        NSLog(@"%@",operation.HTTPRequestOperation.responseString);
    }];
    [[AppDelegate appDelegate].rkomForPost enqueueObjectRequestOperation:operation];

enqueueObjectRequestOperation将完成多部分操作。尝试使用给定的代码。当然它会起作用。

答案 1 :(得分:0)

在iOS 7和Mac OS 10.9 SDK中,Apple在NSData上引入了新的base64方法,因此无需使用第三方base 64解码库。

但根据我的经验,我在使用Apple提供的base64方法时遇到了问题,并且无法解码我的base64 pdf(来自.net服务器)。

所以我尝试了this库,每次都对我有用。我认为这对你也有用。

答案 2 :(得分:0)

由于restkit使用AFNetworking并且它似乎是将转义字符添加到编码图像中,我的服务器端无法处理,我已经确认这是AFNetworking问题而不是Restkit本身,看起来他们已经在2.0中解决了它因为RestKit坚持使用旧版本它无法解决,最后我放弃并选择了ASIHTTP库并手动传递JSON,确保base64编码图像不会被篡改。这解决了这个问题。