1,在post請求下,寫輸出應該在讀取之后,否則會拋出異常。
即操作OutputStream對象應該在InputStreamReader之前。
2.conn.getResponseCode()獲取返回狀態碼最好放在讀寫完成之后,否則也會拋出異常。這里不知道是否是該方法會導致連接關閉,待驗證。
下面貼出工具類代碼
其中GET請求直接在requestUrl里面拼接,POST請求通過outputStr傳入。
/** * 發送https請求 * @param requestUrl 請求地址 * @param requestMethod 請求方式(GET、POST) * @param outputStr 提交的數據 * @return JSONObject(通過JSONObject.get(key)的方式獲取json對象的屬性值) */ public static WxApiResult httpsRequest(String requestUrl, String requestMethod, String outputStr) { WxApiResult message = new WxApiResult(); try{ TrustManager[] tm = { new MyX509TrustManager() }; SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security.SecureRandom()); SSLSocketFactory ssf = sslContext.getSocketFactory(); URL url = new URL(requestUrl); HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); conn.setSSLSocketFactory(ssf); conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); conn.setRequestMethod(requestMethod); if(null != outputStr){ OutputStream outputStream = conn.getOutputStream(); outputStream.write(outputStr.getBytes("UTF-8")); outputStream.close(); } InputStream inputStream = conn.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null; StringBuffer buffer = new StringBuffer(); while ((str = bufferedReader.readLine()) != null){ buffer.append(str); } if(conn.getResponseCode() == conn.HTTP_OK){ message.setCode(0); message.setContent(buffer.toString()); }else{ message.setCode(-1); message.setContent("獲取返回狀態不對,返回狀態為:" + conn.getResponseCode()); } // 釋放資源 bufferedReader.close(); inputStreamReader.close(); inputStream.close(); inputStream = null; conn.disconnect(); }catch (ConnectException ce){ log.error("連接超時:{}", ce); message.setCode(-1); message.setContent(ce.getMessage()); }catch (Exception e){ log.error("https請求異常:{}", e); message.setCode(-1); message.setContent(e.getMessage()); } return message; }