固予GXiOS

iOS base64和URLEncode解决数据传输问题

2017-11-10  本文已影响44人  十一遥

新项目里,有些地方传输中文, GET,参数采用base64编码, 上传的时候,发现安卓可以成功,iOS不行

iOS发送的请求, base64后含有 "+" 和 "/" 在服务器端都会显示成" " (也就是空格). 因而无法解码.

原文: 1977我不记得了
base64编码:MTk3N+aIkeS4jeiusOW+l+S6hg==
iOS抓包此参数为:MTk3N+aIkeS4jeiusOW+l+S6hg==
安卓本地log为:MTk3N+aIkeS4jeiusOW+l+S6hg==
安卓抓包此参数为:MTk3N%2BaIkeS4jeiusOW%2Bl%2BS6hg%3D%3D%0A

我们再把安卓的数据分成两部分:(MTk3N%2BaIkeS4jeiusOW%2Bl%2BS6hg%3D%3D)+(%0A) 

后面的%0A是换行,没有实际意义,那么答案就跃然纸上 安卓发网络请求的时候,系统自动把base64的编码,进行了urlecode处理, 而ios的网络请求,并未做此处理.

iOS处理方法: (文本) ->(base64编码)->(urlencode编码)->搞定

话不多说,直接上代码:

base64编码

//base64encode
+ (NSString *)base64StringFromText:(NSString *)text{
    
    NSData *encodeData = [text dataUsingEncoding:NSUTF8StringEncoding];
    NSString *base64String = [encodeData base64EncodedStringWithOptions:0];
    
    return base64String;
}


//base64encode then urlencode (采用这个方法,一步到位)
+(NSString *)base64AndUrlencodeStringFromText: (NSString *)text{
    
    NSData *encodeData = [text dataUsingEncoding:NSUTF8StringEncoding];
    NSString *base64String = [encodeData base64EncodedStringWithOptions:0];
    
    NSString *encodedString = (NSString *)
    CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                              (CFStringRef)base64String,
                                                              NULL,
                                                              (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                              kCFStringEncodingUTF8));
    
    return encodedString;
}


//base64decode
+ (NSString *)textFromBase64String:(NSString *)text{
    
    NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:text options:0];
   
    NSString *decodedString = [[NSString alloc] initWithData:decodedData encoding:NSUTF8StringEncoding];
    
    return decodedString;
}

urlencode编码

//urlencode
+(NSString*)encodeString:(NSString*)unencodedString{
    
    NSString *encodedString = (NSString *)
    CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                              (CFStringRef)unencodedString,
                                                              NULL,
                                                              (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                              kCFStringEncodingUTF8));
    
    return encodedString;
}


//urldecode
+(NSString *)decodeString:(NSString*)encodedString{
  
    NSString *decodedString  = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL,
                                                                                                                     (__bridge CFStringRef)encodedString,
                                                                                                                     CFSTR(""),
                                                                                                                     CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
    return decodedString;
}
上一篇 下一篇

猜你喜欢

热点阅读