dropbox是国外的一个云存储产品,类似百度云盘,由于最近后台接口升级,很多旧的接口都不能使用了,于是对其进行适配。
如果想看dropbox的api,请自带梯子~~~网址如下:
https://www.dropbox.com/developers/documentation/http/documentation#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")