记录请求手机验证码的一些波折

我们公司申请了一个请求发送手机短信的接口, 为了请求验证码的需求, 但是验证码这6位数需要移动端这边生成, 而且此接口GET/POST皆可, 采取的是拼接网址的形式, 参数字典填空即可. 最后返回的数据格式竟是纯文本.

感谢http://www.cnblogs.com/JM110/p/5547169.html
http://blog.csdn.net/cuibo1123/article/details/40938225

其中一个参数是将申请下来的用户id和密码拼接在一起, 然后经过MD532位小写加密, 再作为参数内容.

(CC_LONG)这个修饰不加会有黄色报警

#pragma mark - md5 32位小写加密
+ (NSString *)md5SecureIn32LowCased:(NSString *)str{
const char *cStr = [str UTF8String];
unsigned char result[16];
CC_MD5(cStr, (CC_LONG)strlen(cStr), result); // This is the md5 call
return [NSString stringWithFormat:@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",result[0], result[1], result[2], result[3],result[4], result[5], result[6], result[7],result[8], result[9], result[10], result[11],result[12], result[13], result[14], result[15]];
}

我使用AFN3.x进行的网络请求, 请求之前, 要对AFHTTPSessionManager进行这些设置

manager.responseSerializer = [AFHTTPResponseSerializer serializer];
 manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects: @"text/plain",  nil];

而且还需要对拼接后的url字符串进行这一步操作, 不然直接崩在afn里面

urlStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

这个接口请求成功后, 接口文档说是返回纯文本格式, 但打印出来是类似于<1233 1231 1231>的东西, 内容我是拿脸敲的. 我们知道这是NSData, 需要转成字符串才看得懂.

首先我们对这个data进行过滤, 过滤掉非utf-8的东西, 再进行转化.

//注意:如果是三字节utf-8,第二字节错误,则先替换第一字节内容(认为此字节误码为三字节utf8的头),然后判断剩下的两个字节是否非法;
+ (NSData *)replaceNoUtf8:(NSData *)data{
char aa[] = {'A','A','A','A','A','A'};                      //utf8最多6个字符,当前方法未使用
NSMutableData *md = [NSMutableData dataWithData:data];
int loc = 0;
while(loc < [md length])
{
    char buffer;
    [md getBytes:&buffer range:NSMakeRange(loc, 1)];
    if((buffer & 0x80) == 0)
    {
        loc++;
        continue;
    }
    else if((buffer & 0xE0) == 0xC0)
    {
        loc++;
        [md getBytes:&buffer range:NSMakeRange(loc, 1)];
        if((buffer & 0xC0) == 0x80)
        {
            loc++;
            continue;
        }
        loc--;
        //非法字符,将这个字符(一个byte)替换为A
        [md replaceBytesInRange:NSMakeRange(loc, 1) withBytes:aa length:1];
        loc++;
        continue;
    }
    else if((buffer & 0xF0) == 0xE0)
    {
        loc++;
        [md getBytes:&buffer range:NSMakeRange(loc, 1)];
        if((buffer & 0xC0) == 0x80)
        {
            loc++;
            [md getBytes:&buffer range:NSMakeRange(loc, 1)];
            if((buffer & 0xC0) == 0x80)
            {
                loc++;
                continue;
            }
            loc--;
        }
        loc--;
        //非法字符,将这个字符(一个byte)替换为A
        [md replaceBytesInRange:NSMakeRange(loc, 1) withBytes:aa length:1];
        loc++;
        continue;
    }
    else
    {
        //非法字符,将这个字符(一个byte)替换为A
        [md replaceBytesInRange:NSMakeRange(loc, 1) withBytes:aa length:1];
        loc++;
        continue;
    }
}

return md;
}

最后将过滤完的data转成utf-8形式的字符串, 就终于是我们人能看懂的文字了

NSString *str = [[NSString alloc] initWithData:data1 encoding:NSUTF8StringEncoding];

你可能感兴趣的:(记录请求手机验证码的一些波折)