設定connection.setRequestMenthod(“GET”)不生效
阿新 • • 發佈:2018-12-10
背景介紹:想要訪問開放的獲取天氣資訊的介面,該介面的請求方式是GET型別的,故程式碼中做了如下設定:
public HttpURLConnection getConnection(String url){ HttpURLConnection connection = null; try { // 開啟和URL之間的連線 URL postUrl = new URL(url); connection = (HttpURLConnection) postUrl.openConnection(); // 設定通用的請求屬性 connection.setDoOutput(true); connection.setDoInput(true); connection.setRequestMethod("GET"); connection.setUseCaches(false); connection.setInstanceFollowRedirects(true); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Charset", "utf-8"); connection.setRequestProperty("Accept-Charset", "utf-8"); DataOutputStream out = null; // 建立實際的連線 connection.connect(); out = new DataOutputStream(connection.getOutputStream()); out.flush(); out.close(); BufferedReader reader = new BufferedReader(new InputStreamReader( connection.getInputStream())); while ((line = reader.readLine()) != null) { httpResults = httpResults + line.toString(); } reader.close(); // 斷開連線 connection.disconnect(); } catch (Exception e) { e.printStackTrace(); } return connection; }
http介面狀態405表示:(方法禁用) 禁用請求中指定的方法。於是猜想我程式碼中是雖設定了請求方式為:get,但是否這一設定成功生效了呢?於是通過debug模式調式程式碼,發現後臺正真的處理方式其實還是post。那麼,系統報405的錯誤就顯得很正常了。
那麼為何,我設定了connection.setRequestMethod("GET");卻未生效呢?通過仔細讀程式碼,發現這段程式碼並沒有實際的用處,於是嘗試將其註釋了,然後再執行我的測試用例,發現成功的返回介面資料。
out = new DataOutputStream(connection.getOutputStream()); out.flush(); out.close();
通過一波百度,原來DataOutputStream out = new DataOutputStream(connection.getOutputStream());
執行這句會自動把介面的請求型別設定為POST, 因為只有POST方法才能傳送 “附加資料” 也就是你要傳送的JSON字串。
GET方法不能傳送“附加資料”,所有的資料必須方法請求地址的URL中(不理解這句話,可以瞭解一下get請求和post請求的區別)。