Http通信概述
Http通信主要有兩種方式POST方式和GET方式。前者通過Http消息實體發送數據給服務器,安全性高,數據傳輸大小沒有限制,後者通過URL的查詢字符串傳遞給服務器參數,以明文顯示在瀏覽器地址欄,保密性差,最多傳輸2048個字符。但是GET請求並不是一無是處――GET請求大多用於查詢(讀取資源),效率高。 POST請求用於註冊、登錄等安全性較高且向數據庫中寫入數據的操作。
除了POST和GET,http通信還有其他方式!請參見http請求的方法
編碼前的準備
在進行編碼之前,我們先創建一個Servlet,該Servlet接收客戶端的參數(name和age),並響應客戶端。
@WebServlet(urlPatterns={"/demo.do"})public class DemoServlet extends HttpServlet { 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{ 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());}
使用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是Apache Jakarta Common下的子項目,用來提供高效的、最新的、功能豐富的支持HTTP協議的客戶端編程工具包,並且它支持HTTP協議最新的版本和建議。 HttpClient已經應用在很多的項目中,比如Apache Jakarta上很著名的另外兩個開源項目Cactus和HTMLUnit都使用了HttpClient。