簡單介紹Java網(wǎng)絡(luò)編程中的HTTP請求
HTTP請求的細節(jié)——請求行
請求行中的GET稱之為請求方式,請求方式有:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT,常用的有: GET、 POST
用戶如果沒有設(shè)置,默認情況下瀏覽器向服務(wù)器發(fā)送的都是get請求,例如在瀏覽器直接輸?shù)刂吩L問,點超鏈接訪問等都是get,用戶如想把請求方式改為post,可通過更改表單的提交方式實現(xiàn)。
不管POST或GET,都用于向服務(wù)器請求某個WEB資源,這兩種方式的區(qū)別主要表現(xiàn)在數(shù)據(jù)傳遞上:如果請求方式為GET方式,則可以在請求的URL地址后以?的形式帶上交給服務(wù)器的數(shù)據(jù),多個數(shù)據(jù)之間以&進行分隔,例如:GET /mail/1.html?name=abc&password=xyz HTTP/1.1
GET方式的特點:在URL地址后附帶的參數(shù)是有限制的,其數(shù)據(jù)容量通常不能超過1K。
如果請求方式為POST方式,則可以在請求的實體內(nèi)容中向服務(wù)器發(fā)送數(shù)據(jù),Post方式的特點:傳送的數(shù)據(jù)量無限制。
HTTP請求的細節(jié)——消息頭
HTTP請求中的常用消息頭
accept:瀏覽器通過這個頭告訴服務(wù)器,它所支持的數(shù)據(jù)類型
Accept-Charset: 瀏覽器通過這個頭告訴服務(wù)器,它支持哪種字符集
Accept-Encoding:瀏覽器通過這個頭告訴服務(wù)器,支持的壓縮格式
Accept-Language:瀏覽器通過這個頭告訴服務(wù)器,它的語言環(huán)境
Host:瀏覽器通過這個頭告訴服務(wù)器,想訪問哪臺主機
If-Modified-Since: 瀏覽器通過這個頭告訴服務(wù)器,緩存數(shù)據(jù)的時間
Referer:瀏覽器通過這個頭告訴服務(wù)器,客戶機是哪個頁面來的 防盜鏈
Connection:瀏覽器通過這個頭告訴服務(wù)器,請求完后是斷開鏈接還是何持鏈接
例:
http_get
import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class Http_Get { private static String URL_PATH = "http://192.168.1.125:8080/myhttp/pro1.png"; public Http_Get() { // TODO Auto-generated constructor stub } public static void saveImageToDisk() { InputStream inputStream = getInputStream(); byte[] data = new byte[1024]; int len = 0; FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream("C:\\test.png"); while ((len = inputStream.read(data)) != -1) { fileOutputStream.write(data, 0, len); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } /** * 獲得服務(wù)器端的數(shù)據(jù),以InputStream形式返回 * @return */ public static InputStream getInputStream() { InputStream inputStream = null; HttpURLConnection httpURLConnection = null; try { URL url = new URL(URL_PATH); if (url != null) { httpURLConnection = (HttpURLConnection) url.openConnection(); // 設(shè)置連接網(wǎng)絡(luò)的超時時間 httpURLConnection.setConnectTimeout(3000); httpURLConnection.setDoInput(true); // 表示設(shè)置本次http請求使用GET方式請求 httpURLConnection.setRequestMethod("GET"); int responseCode = httpURLConnection.getResponseCode(); if (responseCode == 200) { // 從服務(wù)器獲得一個輸入流 inputStream = httpURLConnection.getInputStream(); } } } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return inputStream; } public static void main(String[] args) { // 從服務(wù)器獲得圖片保存到本地 saveImageToDisk(); } }
Http_Post
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; public class Http_Post { // 請求服務(wù)器端的url private static String PATH = "http://192.168.1.125:8080/myhttp/servlet/LoginAction"; private static URL url; public Http_Post() { // TODO Auto-generated constructor stub } static { try { url = new URL(PATH); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * @param params * 填寫的url的參數(shù) * @param encode * 字節(jié)編碼 * @return */ public static String sendPostMessage(Map<String, String> params, String encode) { // 作為StringBuffer初始化的字符串 StringBuffer buffer = new StringBuffer(); try { if (params != null && !params.isEmpty()) { for (Map.Entry<String, String> entry : params.entrySet()) { // 完成轉(zhuǎn)碼操作 buffer.append(entry.getKey()).append("=").append( URLEncoder.encode(entry.getValue(), encode)) .append("&"); } buffer.deleteCharAt(buffer.length() - 1); } // System.out.println(buffer.toString()); // 刪除掉最有一個& System.out.println("-->>"+buffer.toString()); HttpURLConnection urlConnection = (HttpURLConnection) url .openConnection(); urlConnection.setConnectTimeout(3000); urlConnection.setRequestMethod("POST"); urlConnection.setDoInput(true);// 表示從服務(wù)器獲取數(shù)據(jù) urlConnection.setDoOutput(true);// 表示向服務(wù)器寫數(shù)據(jù) // 獲得上傳信息的字節(jié)大小以及長度 byte[] mydata = buffer.toString().getBytes(); // 表示設(shè)置請求體的類型是文本類型 urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); urlConnection.setRequestProperty("Content-Length", String.valueOf(mydata.length)); // 獲得輸出流,向服務(wù)器輸出數(shù)據(jù) OutputStream outputStream = urlConnection.getOutputStream(); outputStream.write(mydata,0,mydata.length); outputStream.close(); // 獲得服務(wù)器響應(yīng)的結(jié)果和狀態(tài)碼 int responseCode = urlConnection.getResponseCode(); if (responseCode == 200) { return changeInputStream(urlConnection.getInputStream(), encode); } } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ""; } /** * 將一個輸入流轉(zhuǎn)換成指定編碼的字符串 * * @param inputStream * @param encode * @return */ private static String changeInputStream(InputStream inputStream, String encode) { // TODO Auto-generated method stub ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] data = new byte[1024]; int len = 0; String result = ""; if (inputStream != null) { try { while ((len = inputStream.read(data)) != -1) { outputStream.write(data, 0, len); } result = new String(outputStream.toByteArray(), encode); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return result; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Map<String, String> params = new HashMap<String, String>(); params.put("username", "admin"); params.put("password", "123"); String result = Http_Post.sendPostMessage(params, "utf-8"); System.out.println("--result->>" + result); } }
相關(guān)文章
Java初學(xué)者問題圖解(動力節(jié)點Java學(xué)院整理)
本文通過圖文并茂的形式給大家介紹了java初學(xué)者問題,非常不錯,具有參考借鑒價值,需要的朋友參考下2017-04-04Java安全框架——Shiro的使用詳解(附springboot整合Shiro的demo)
這篇文章主要介紹了Java安全框架——Shiro的使用詳解,幫助大家更好的理解和學(xué)習(xí)使用Shiro,感興趣的朋友可以了解下2021-04-04Java中實體類為什么要實現(xiàn)Serializable序列化的作用
這篇文章主要介紹了Java中實體類為什么要實現(xiàn)Serializable序列化的作用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Java結(jié)構(gòu)型設(shè)計模式之裝飾模式詳解
裝飾模式(Decorator Pattern)允許向一個現(xiàn)有的對象添加新的功能,同時又不改變其結(jié)構(gòu)。這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有類的一個包裝。這種模式創(chuàng)建了一個裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能2023-03-03SpringMVC中Model和ModelAndView的EL表達式取值方法
下面小編就為大家分享一篇SpringMVC中Model和ModelAndView的EL表達式取值方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03