dropbox是國外的一個云存儲產(chǎn)品,類似百度云盤温自,由于最近后臺接口升級,很多舊的接口都不能使用了皇钞,于是對其進(jìn)行適配。
如果想看dropbox的api松捉,請自帶梯子~~~網(wǎng)址如下:
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規(guī)則在命令行下工作的文件傳輸工具夹界。它支持文件的上傳和下載,所以是綜合傳輸工具隘世,但按傳統(tǒng)可柿,習(xí)慣稱curl為下載工具。作為一款強(qiáng)力工具丙者,curl支持包括HTTP复斥、HTTPS、ftp等眾多協(xié)議械媒,還支持POST目锭、cookies评汰、認(rèn)證、從指定偏移處下載部分文件痢虹、用戶代理字符串被去、限速、文件大小奖唯、進(jìn)度條等特征惨缆。做網(wǎng)頁開發(fā),curl是很重要的命令丰捷。不過做android 的我基本沒怎么使用坯墨,都是使用postman之類的工具代替。病往。捣染。
一看接口,很簡單呀荣恐,三下五除二就寫完了液斜,運(yùn)行程序,調(diào)用接口叠穆,what少漆。。硼被。
怎么提示我Dropbox-API-Arg不能轉(zhuǎn)化成json,打印字符串也完全沒有問題啊示损。。嚷硫。
各種head都設(shè)置了检访。。仔掸。暈脆贵。。起暮。
官網(wǎng)也沒有什么說明卖氨。。负懦。筒捺。
后來懷疑會不會是編碼問題,發(fā)現(xiàn)我的json里面含有中文纸厉,使用英文路徑果然正常了系吭。
HttpURLConnection的getHeaderField默認(rèn)所有header是用iso-8859-1編碼的,但是中文實際是用uft8編碼颗品。所以就出現(xiàn)了亂碼問題肯尺。而我們打印使用utf8當(dāng)然也不會有亂碼了沃缘。
既然知道原因,解決起來就很簡單了蟆盹。
這里主要有兩個做法孩灯,一種是吧中文和全角符號全部轉(zhuǎn)化unicode。
unicode是一種能表示所有字符的編碼方案逾滥,所以這樣服務(wù)器就能夠正確識別了峰档,解決亂碼對json解析錯誤問題。至于編碼的各種概念寨昙,請自行g(shù)oogle讥巡。具體代碼如下:
/**
* 中文轉(zhuǎn)換成 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) {
// 英文及數(shù)字等
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();
}
另外一種方法就是把多字節(jié)的編碼轉(zhuǎn)換成單字節(jié)的iso-8859-1,這樣并不會造成編碼信息的丟失。
new String(jsonString.getBytes("ISO-8859-1"),"utf8")