适配dropbox遇到的一个问题

作者: 三也视界 | 来源:发表于2017-11-16 00:14 被阅读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")  
    

    相关文章

      网友评论

        本文标题:适配dropbox遇到的一个问题

        本文链接:https://www.haomeiwen.com/subject/usxrmxtx.html