踩坑經歷
因為項目需要去對接別的接口,使用URLConnection POST請求https接口,發送json數組時遇到java.io.IOException: Server returned HTTP response code: 500 for URL。
當時情況是本地測試通過,正常返回,放到linux雲服務器上測試通過,正常返回,放到windows server服務器上就有問題了,就是上面所說的。
根據報錯分析首先聯系接收方,發現對方沒有報錯內容,於是從自身找問題。首先想到是編碼格式於是
嘗試1
參考:https://blog.csdn.net/heweirun_2014/article/details/45535193
connection.setRequestProperty(“User-Agent”, “Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)”);
最終沒有解決問題
嘗試2
conn.setRequestProperty("charsert", "utf-8");
最終沒有解決問題
嘗試3
參考:https://blog.csdn.net/maggiehexu/article/details/6448347
排除掉請求參數為空
最終沒有解決問題
嘗試4
out.println(param.getBytes("UTF-8"));
最終沒有解決問題
嘗試5
使用
OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream(), "utf-8");
out.write(param);
替換的
PrintWriter out = new PrintWriter(conn.getOutputStream()); // 用PrintWriter進行包裝
out.println(param);
問題解決了!!!!!!!!一萬頭草泥馬奔騰而過>_<
最后貼上代碼希望對你有所幫助
/** post請求 */ public static String reqPost(String url, String param) throws IOException { String res = ""; URLConnection conn = getConnection(url); // POST要求URL中不包含請求參數 conn.setDoOutput(true); // 必須設置這兩個請求屬性為true,就表示默認使用POST發送 conn.setDoInput(true); //conn.setRequestProperty("charsert", "utf-8"); // 請求參數必須使用conn獲取的OutputStream輸出到請求體參數 // 用PrintWriter進行包裝 /*PrintWriter out = new PrintWriter(conn.getOutputStream()); out.println(param.getBytes("UTF-8"));*/ OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream(), "utf-8"); out.write(param); out.flush(); // 立即充刷至請求體)PrintWriter默認先寫在內存緩存中 try// 發送正常的請求(獲取資源) { BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8")); String line; while ((line = in.readLine()) != null) { res += line + "\n"; } } catch (Exception e) { e.printStackTrace(); log.error(e.toString()); } return res; }