前兩天調用集成的某服務商API,本機測試通過後部署線上,卻毫無反響。日誌打了一大堆,balabala都沒問題,但一到調用該服務商jar包的時候就悄無聲息。本機啓動時候程序又嘩嘩的跑,真是氣死個人。初以爲線上服務器環境或權限有問題,刪了重安各種折騰,一通下來居然依舊不行。心灰意冷之下看了看線上服務器啓動腳本,嗯,jdk1.7。再瞅了一眼本地測試環境,嗯,1.8。。。
臥槽?!!難道是jdk版本,話說現在兼容性這麼強,支持1.8的居然無法支持1.7?臆測是沒用的,去代碼裏看看吧。
this.baseToken =new String(Base64.getEncoder().encode(code.getBytes()));
嗯,之前的都是初始化,無關緊要。莫非是這句base64編碼?於是我在線下切成了1.7環境……咦?怎麼沒這個包了?
居然,就是因爲base64編碼使用的是jdk1.8自帶的包,而1.7沒有!枉我頭疼了大半天找原因。話說如果只有這麼一個地方不支持1.7的話。用外部的包編碼不就好了嗎!跑去問客服,回答的竟然也是,我們只支持1.8,不支持1.7。。迷一樣的API。
最後貼出來1.8的base64編碼學習一下吧~
public static Encoder getEncoder() { return Encoder.RFC4648; } static final Encoder RFC4648 = new Encoder(false, null, -1, true);
public byte[] encode(byte[] src) { int len = outLength(src.length); // dst array size byte[] dst = new byte[len]; int ret = encode0(src, 0, src.length, dst); if (ret != dst.length) return Arrays.copyOf(dst, ret); return dst; }
private final int outLength(int srclen) { int len = 0; if (doPadding) { len = 4 * ((srclen + 2) / 3); } else { int n = srclen % 3; len = 4 * (srclen / 3) + (n == 0 ? 0 : n + 1); } if (linemax > 0) // line separators len += (len - 1) / linemax * newline.length; return len; }
private int encode0(byte[] src, int off, int end, byte[] dst) { char[] base64 = isURL ? toBase64URL : toBase64; int sp = off; int slen = (end - off) / 3 * 3; int sl = off + slen; if (linemax > 0 && slen > linemax / 4 * 3) slen = linemax / 4 * 3; int dp = 0; while (sp < sl) { int sl0 = Math.min(sp + slen, sl); for (int sp0 = sp, dp0 = dp ; sp0 < sl0; ) { int bits = (src[sp0++] & 0xff) << 16 | (src[sp0++] & 0xff) << 8 | (src[sp0++] & 0xff); dst[dp0++] = (byte)base64[(bits >>> 18) & 0x3f]; dst[dp0++] = (byte)base64[(bits >>> 12) & 0x3f]; dst[dp0++] = (byte)base64[(bits >>> 6) & 0x3f]; dst[dp0++] = (byte)base64[bits & 0x3f]; } int dlen = (sl0 - sp) / 3 * 4; dp += dlen; sp = sl0; if (dlen == linemax && sp < end) { for (byte b : newline){ dst[dp++] = b; } } } if (sp < end) { // 1 or 2 leftover bytes int b0 = src[sp++] & 0xff; dst[dp++] = (byte)base64[b0 >> 2]; if (sp == end) { dst[dp++] = (byte)base64[(b0 << 4) & 0x3f]; if (doPadding) { dst[dp++] = '='; dst[dp++] = '='; } } else { int b1 = src[sp++] & 0xff; dst[dp++] = (byte)base64[(b0 << 4) & 0x3f | (b1 >> 4)]; dst[dp++] = (byte)base64[(b1 << 2) & 0x3f]; if (doPadding) { dst[dp++] = '='; } } } return dp; } }
public static byte[] copyOf(byte[] original, int newLength) { byte[] copy = new byte[newLength]; System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; }
以上就是我被坑的過程,記錄一下,免得以後再犯找不到原因。