Android开发经验谈Android开发Android技术知识

适配dropbox遇到的一个问题

2017-11-16  本文已影响164人  三也视界

dropbox是国外的一个云存储产品,类似百度云盘,由于最近后台接口升级,很多旧的接口都不能使用了,于是对其进行适配。

如果想看dropbox的api,请自带梯子~~~网址如下:
https://www.dropbox.com/developers/documentation/http/documentation#files-upload

这里简单的列一下接口情况

https://content.dropboxapi.com/2/files/upload

curl -X POST https://content.dropboxapi.com/2/files/upload \
    --header "Authorization: Bearer <get access token>" \
    --header "Dropbox-API-Arg: {\"path\": \"/Homework/math/Matrices.txt\",\"mode\": \"add\",\"autorename\": true,\"mute\": false}" \
    --header "Content-Type: application/octet-stream" \
    --data-binary @local_file.txt

{
    "path": "/Homework/math/Matrices.txt",
    "mode": "add",
    "autorename": true,
    "mute": false
}

curl命令是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具。作为一款强力工具,curl支持包括HTTP、HTTPS、ftp等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。做网页开发,curl是很重要的命令。不过做android 的我基本没怎么使用,都是使用postman之类的工具代替。。。

一看接口,很简单呀,三下五除二就写完了,运行程序,调用接口,what。。。
怎么提示我Dropbox-API-Arg不能转化成json,打印字符串也完全没有问题啊。。。
各种head都设置了。。。晕。。。

官网也没有什么说明。。。。

后来怀疑会不会是编码问题,发现我的json里面含有中文,使用英文路径果然正常了。

HttpURLConnection的getHeaderField默认所有header是用iso-8859-1编码的,但是中文实际是用uft8编码。所以就出现了乱码问题。而我们打印使用utf8当然也不会有乱码了。

既然知道原因,解决起来就很简单了。

这里主要有两个做法,一种是吧中文和全角符号全部转化unicode。
unicode是一种能表示所有字符的编码方案,所以这样服务器就能够正确识别了,解决乱码对json解析错误问题。至于编码的各种概念,请自行google。具体代码如下:

 /**
     * 中文转换成 unicode
     *
     * @author leon 2016-3-15
     * @param inStr
     * @return
     */
    public static String encodeUnicode(String inStr) {
        char[] myBuffer = inStr.toCharArray();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < inStr.length(); i++) {
            char ch = myBuffer[i];
            if (ch < 10) {
                sb.append("\\u000" + (int) ch);
                continue;
            }
            Character.UnicodeBlock ub = Character.UnicodeBlock.of(ch);
            if (ub == Character.UnicodeBlock.BASIC_LATIN) {
                // 英文及数字等
                sb.append(myBuffer[i]);
            } else if (ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
                // 全角半角字符
                int j = myBuffer[i] - 65248;
                sb.append((char) j);
            } else {
                // 汉字
                int s = myBuffer[i];
                String hexS = Integer.toHexString(Math.abs(s));
                String unicode = "\\u" + hexS;
                sb.append(unicode.toLowerCase());
            }
        }
        return sb.toString();
    }

另外一种方法就是把多字节的编码转换成单字节的iso-8859-1,这样并不会造成编码信息的丢失。

    new String(jsonString.getBytes("ISO-8859-1"),"utf8")  
上一篇 下一篇

猜你喜欢

热点阅读