Http通訊概述 Http通訊主要有兩種方式POST方式和GET方式。前者經過Http消息實體發送數據給服務器,安全性高,數據傳輸大小沒有限制,後者經過URL的查詢字符串傳遞給服務器參數,以明文顯示在瀏覽器地址欄,保密性差,最多傳輸2048個字符。可是GET請求並非一無可取——GET請求大多用於查詢(讀取資源),效率高。POST請求用於註冊、登陸等安全性較高且向數據庫中寫入數據的操做。html
除了POST和GET,http通訊還有其餘方式!請參見http請求的方法java
編碼前的準備 在進行編碼以前,咱們先建立一個Servlet,該Servlet接收客戶端的參數(name和age),並響應客戶端。數據庫
@WebServlet(urlPatterns={"/demo.do"}) public class DemoServlet extends HttpServlet {apache
private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); String name = request.getParameter("name"); String age = request.getParameter("age"); PrintWriter pw = response.getWriter(); pw.print("您使用GET方式請求該Servlet。<br />" + "name = " + name + ",age = " + age); pw.flush(); pw.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); String name = request.getParameter("name"); String age = request.getParameter("age"); PrintWriter pw = response.getWriter(); pw.print("您使用POST方式請求該Servlet。<br />" + "name = " + name + ",age = " + age); pw.flush(); pw.close(); }
} 使用JDK實現http通訊 使用URLConnection實現GET請求 實例化一個java.net.URL對象; 經過URL對象的openConnection()方法獲得一個java.net.URLConnection; 經過URLConnection對象的getInputStream()方法得到輸入流; 讀取輸入流; 關閉資源。 public void get() throws Exception{瀏覽器
URL url = new URL("http://127.0.0.1/http/demo.do?name=Jack&age=10"); URLConnection urlConnection = url.openConnection(); // 打開鏈接 BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(),"utf-8")); // 獲取輸入流 String line = null; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { sb.append(line + "\n"); } System.out.println(sb.toString());
}安全
使用HttpURLConnection實現POST請求 java.net.HttpURLConnection是java.net.URL的子類,提供了更多的關於http的操做(getXXX 和 setXXX方法)。該類中定義了一系列的HTTP狀態碼:服務器
public void post() throws IOException{app
URL url = new URL("http://127.0.0.1/http/demo.do"); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setDoInput(true); httpURLConnection.setDoOutput(true); // 設置該鏈接是能夠輸出的 httpURLConnection.setRequestMethod("POST"); // 設置請求方式 httpURLConnection.setRequestProperty("charset", "utf-8"); PrintWriter pw = new PrintWriter(new BufferedOutputStream(httpURLConnection.getOutputStream())); pw.write("name=welcome"); // 向鏈接中輸出數據(至關於發送數據給服務器) pw.write("&age=14"); pw.flush(); pw.close(); BufferedReader br = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(),"utf-8")); String line = null; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { // 讀取數據 sb.append(line + "\n"); } System.out.println(sb.toString());
}maven
使用httpclient進行http通訊 httpclient大大簡化了JDK中http通訊的實現。工具
maven依賴:
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.3.6</version> </dependency> GET請求 public void httpclientGet() throws Exception{
// 建立HttpClient對象 HttpClient client = HttpClients.createDefault(); // 建立GET請求(在構造器中傳入URL字符串便可) HttpGet get = new HttpGet("http://127.0.0.1/http/demo.do?name=admin&age=40"); // 調用HttpClient對象的execute方法得到響應 HttpResponse response = client.execute(get); // 調用HttpResponse對象的getEntity方法獲得響應實體 HttpEntity httpEntity = response.getEntity(); // 使用EntityUtils工具類獲得響應的字符串表示 String result = EntityUtils.toString(httpEntity,"utf-8"); System.out.println(result);
}
POST請求 public void httpclientPost() throws Exception{
// 建立HttpClient對象 HttpClient client = HttpClients.createDefault(); // 建立POST請求 HttpPost post = new HttpPost("http://127.0.0.1/http/demo.do"); // 建立一個List容器,用於存放基本鍵值對(基本鍵值對即:參數名-參數值) List<BasicNameValuePair> parameters = new ArrayList<>(); parameters.add(new BasicNameValuePair("name", "張三")); parameters.add(new BasicNameValuePair("age", "25")); // 向POST請求中添加消息實體 post.setEntity(new UrlEncodedFormEntity(parameters, "utf-8")); // 獲得響應並轉化成字符串 HttpResponse response = client.execute(post); HttpEntity httpEntity = response.getEntity(); String result = EntityUtils.toString(httpEntity,"utf-8"); System.out.println(result);
}
參考文檔 httpclient官網