今天接短信接口,短信接口提供了sdk,我們可以直接用sdk發送請求然后發送對應短信。
但是想使用我們平台自定義的httpUtil實現。
然而忙了1天半,才解決這個問題,還是我同事幫忙找出問題並解決的。
步驟:
1、請求信息轉json
2、json走AES加密得到byte[]
3、將byte[]放入post請求發送,並接受響應。
sdk直接成功,它是自己基於HttpURLConnection封裝的一套HttpUtil,直接接受了byte[]作為請求參數,使用post發送響應成功
我們的HttpUtil是基於HttpClient封裝而來,post方法只能接受String或Map參數,於是將加密后的byte[] 進行new String()操作后傳入,跟進信息,底層將該String采用getByte("UTF-8")進行轉換給Request然后請求。一直返回解密失敗。
反復調試,將contentType指定為text/plain,編碼統一都是UTF-8。但依舊一直該錯誤。對比兩種方式加密后byte[],沒有區別。最后發現使用new String(byte[])之后getByte()得到的byte[]容量變大,顛覆我的認知了,byte[]數組經過指定編碼new String()然后經過指定編碼getByte[]得到的居然不一致。后面定位原因是我系統默認的編碼和指定的編碼都是UTF-8,但是AES加密產生的byte[]的編碼是ISO-8859-1,導致得到的byte[]不是原來的byte[],所以解密失敗。
也就是說我前面解碼byte[]得到字符串的時候使用了錯誤編碼,導致后面getByte指定錯誤編碼得到的字符串解密后不是原來的樣子。