java構造http請求的幾種方式(附源碼)
一、form表單構造http請求
form (表單) 是 HTML 中的一個常用標簽. 可以用于給服務器發(fā)送 GET 或者 POST 請求.
form 的重要參數(shù):
- action: 構造的 HTTP 請求的 URL 是什么.
- method: 構造的 HTTP 請求的 方法 是 GET 還是 POST (form 只支持 GET 和 POST).
input 的重要參數(shù):
- type: 表示輸入框的類型. text 表示文本, password 表示密碼, submit 表示提交按鈕.
- name: 表示構造出的 HTTP 請求的 query string 的 key. query string 的 value 就是輸入框的用戶輸入的內(nèi)容.
- value: input 標簽的值. 對于 type 為 submit 類型來說, value 就對應了按鈕上顯示的文本.
<form method="get" action="/collect"> <input type="text" name="today"> <input type="text" name="result"> <button>提交</button> </form>
<form method="post" action="/collect"> <input type="text" name="today"> <input type="text" name="result"> <button>提交</button> </form>
以下是/collect資源,支持get和post請求:
打開所在的頁面,輸入,并點擊提交(以post為例子):
打開開發(fā)者工具的網(wǎng)絡面板可以觀察到:
請求頭和響應頭為:
請求體為:
get方法同理,只是請求體中的數(shù)據(jù)去到了請求頭中變成查詢字符串了。
二、ajax構造http請求
從前端角度, 除了瀏覽器地址欄能構造 GET 請求, form 表單能構造 GET 和 POST 之外, 還可以通過 ajax的方式來構造 HTTP 請求. 并且功能更強大.
ajax 全稱 Asynchronous Javascript And XML, 是 2005 年提出的一種 JavaScript 給服務器發(fā)送
HTTP 請求的方式.
特點是可以不需要 刷新頁面/頁面跳轉(zhuǎn) 就能進行數(shù)據(jù)傳輸.
在 JavaScript 中可以通過 ajax 的方式構造 HTTP 請求.
<!DOCTYPE html> <html lang="zh-hans"> <head> <meta charset="UTF-8"> <title>發(fā)送有請求體的 ajax 請求</title> </head> <body> <script src="/js/ajax-send-request-body.js"></script> </body> </html>
以下是js代碼:
// 1. 創(chuàng)建 XMLHttpRequest 對象 var xhr = new XMLHttpRequest() // 2. 調(diào)用 open 方法設置要訪問的 url xhr.open('post', '/collect') // 3. 默認異步處理響應. 需要掛在處理響應的回調(diào)函數(shù). xhr.onload = function() { console.log(xhr) console.log(this) console.log(this.status) console.log(this.getResponseHeader('location')) // header 中的 name 不區(qū)分大小寫 console.log(this.responseText) } // 區(qū)別在這里, 調(diào)用 setRequestHeader 設置請求頭。設置類型是text類型, 也可以是application/x-www-form-urlencoded 類型 xhr.setRequestHeader('Content-Type', 'text/killingvibe') // 4. 調(diào)用 send 方法發(fā)送 http 請求 xhr.send('我隨便寫,按照 content-type 的格式去寫就行')
地址欄輸入http://127.0.0.1:8080/ajax-send-request-body.html 后,打開網(wǎng)絡面板,我們可以看到三個請求包,
拓展:
發(fā)送 application/json 數(shù)據(jù),只需要將上述代碼下面改成如下:
// 調(diào)用 setRequestHeader 設置請求頭 httpRequest.setRequestHeader('Content-Type', 'application/json'); // 4. 調(diào)用 send 方法發(fā)送 http 請求 httpRequest.send(JSON.stringify({ name: 'zhangsan', age: 18 }));
三、Java socket構造http請求
所謂的 “發(fā)送 HTTP 請求”, 本質(zhì)上就是按照 HTTP 的格式往 TCP Socket 中寫入一個字符串.
所謂的 “接受 HTTP 響應”, 本質(zhì)上就是從 TCP Socket 中讀取一個字符串, 再按照 HTTP 的格式來解析.
我們基于 Socket 的知識, 完全可以構造出一個簡單的 HTTP 客戶端程序, 用來發(fā)送各種類型的 HTTP 請求.
客戶端代碼:
public class MyHttpClient { public static void main(String[] args) throws Exception { // 只能進行一次請求-響應的 HTTP 客戶端 // 主機 127.0.0.1 // 端口(進程) 8080 // 資源路徑 /hello.html try (Socket socket = new Socket("127.0.0.1", 8080)) { // 準備 HTTP 請求內(nèi)容 // 文本 String // 格式:請求行 String requestLine = "GET /hello.html HTTP/1.0\r\n"; // 請求頭:完全可以沒有,但必須一個空行結尾 String requestHeader1 = "Name: killingvibe\r\n\r\n"; // 請求頭中共有 1對 key-value String requestHeader2 = "Name: killingvibe\r\nAge: 1999\r\n\r\n"; // 請求頭中共有 2對 key-value String requestHeader3 = "\r\n"; // 請求頭中共有 0 對 key-value // 請求體,GET 是沒有請求體 // 最終的請求 —— 要發(fā)送給服務器的東西 String request = requestLine + requestHeader3; // 發(fā)送服務器的過程 byte[] requestBytes = request.getBytes("ISO-8859-1"); // 字符集編碼 // 發(fā)送(數(shù)據(jù)會經(jīng)由 TCP、IP、以太網(wǎng)發(fā)送給服務器) OutputStream os = socket.getOutputStream(); os.write(requestBytes); os.flush(); // 請求既然已經(jīng)發(fā)送,我們要做的就是等待響應 InputStream is = socket.getInputStream(); Scanner scanner = new Scanner(is, "UTF-8"); // 響應的前面字符集應該是 ISO-8859-1,后邊是 UTF-8 while (scanner.hasNextLine()) { String line = scanner.nextLine(); System.out.println(line); } } } }
服務端代碼:
public class MyHttpServer { public static void main(String[] args) throws Exception { // 我們也監(jiān)聽在 8080 端口上 try (ServerSocket serverSocket = new ServerSocket(8080)) { while (true) { Socket socket = serverSocket.accept(); // 三次握手完成 // 讀取用戶的請求 :咱這里就不管用戶的請求是啥了,一律采用相同的方式返回響應 // 發(fā)送響應 // Content-Type: 瀏覽器應該按照什么格式來看到我們響應的資源內(nèi)容的(資源內(nèi)容放在響應體中) // 響應體(資源的內(nèi)容) String responseBody = "<h1>Welcome MyHttpServer</h1>"; byte[] responseBodyBytes = responseBody.getBytes("UTF-8"); int contentLength = responseBodyBytes.length; System.out.println("發(fā)送響應"); String response = "HTTP/1.0 200 OK\r\n" + "Server: killingvibeServer\r\n" + "Content-Type: text/plain; charset=utf-8\r\n" // 響應體的類型 + "Content-Length: " + contentLength + "\r\n" // 響應體的長度 + "\r\n"; byte[] responseBytes = response.getBytes("ISO-8859-1"); OutputStream os = socket.getOutputStream(); // TCP 是面向字節(jié)流的一種協(xié)議,所以只要按順序發(fā)即可,不要管分幾次發(fā)送 os.write(responseBytes); // 先發(fā)送前面部分(響應行 和 響應頭) os.write(responseBodyBytes); // 再發(fā)送響應體 os.flush(); // 發(fā)送完成之后,直接關閉 TCP 連接(短連接的處理模式) socket.close(); } } } }
控制臺打印如下:
總結
到此這篇關于java構造http請求的幾種方式(附源碼)的文章就介紹到這了,更多相關java構造http請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解析Oracle數(shù)據(jù)庫中的對象集合schema
這篇文章主要介紹了Oracle數(shù)據(jù)庫中的對象集合schema,是Oracle數(shù)據(jù)庫入門學習中的基礎知識,需要的朋友可以參考下2015-11-11Java8的DateTimeFormatter與SimpleDateFormat的區(qū)別詳解
這篇文章主要介紹了Java8的DateTimeFormatter與SimpleDateFormat的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-03-03