【问题标题】:Prevent Restkit from adding escape characters?防止 Restkit 添加转义字符?
【发布时间】:2015-03-28 13:59:37
【问题描述】:

我正在尝试使用 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 请求

【问题讨论】:

  • 您采用什么方法来创建 base64 字符串(显示代码)?
  • @Wain 添加了您要求的详细信息,请检查
  • @wain 我的问题与stackoverflow.com/questions/14724868/… 类似,但不确定答案到底在说什么
  • 另一个答案看起来好像是处理提供的编码的服务器问题,而不是客户端问题......
  • @wain 当然,但是当服务器 API 已经投入生产并且其他客户端(如 web 和 android)正常工作时,这是不可能的

标签: ios json base64 restkit


【解决方案1】:

如果我没记错的话,你会卡在通过 restkit 向服务器发送图像。我的朋友尝试使用 multipart。

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

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 将完成多部分操作。尝试使用给定的代码。肯定会成功的。

【讨论】:

  • 问题出在服务器端,它需要一个 JSON 对象,其中一个字段作为图像内容编码为 base64 我认为这不会起作用
  • 不使用 servicestack 用 .net 编写
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢我目前正在使用同一个库,但如果你阅读我的问题,问题不在于编码,而是关于 restkit
【解决方案3】:

由于 restkit 使用 AFNetworking 并且似乎向编码图像添加转义字符,我的服务器端无法处理,我已经确认这是 AFNetworking 问题而不是 Restkit 本身,并且似乎他们已经在 2.0 中解决了它,但自从 RestKit被旧版本卡住无法解决,最后我放弃并选择了 ASIHTTP 库并通过手动制作的 JSON 确保 base64 编码的图像不会被篡改。这解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2014-09-21
    相关资源
    最近更新 更多