1、前置準備
1.1、SpringBoot項目下:寫一個controller
@RestController
public class TestController {@RequestMapping("/yyy")public void test(HttpServletRequest request, HttpServletResponse response){String yang = request.getParameter("yang");System.out.println(yang);}
}
1.2、Html中寫一段jquery的$.ajax方法
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><!--注意:引入jquery--><script src="jquery-3.7.1.min.js"></script>
</head>
<body><script>var o = {key1: 'value1',key2: 'value2',yang: '12312312'}$.ajax({url: '/yyy',type: 'POST',data: o,// 其他參數...success: function(response) {// 處理成功的回調},error: function(error) {// 處理錯誤的回調}});</script>
</body>
</html>
1.3、$.ajax的參數介紹
https://zhuanlan.zhihu.com/p/613814478
1、type:指定了請求的類型,常見的請求類型有GET、POST、PUT、DELETE等,
分別對應著獲取數據、新增數據、更新數據、刪除數據等操作。type參數的默認值是GET。2、url:請求的地址。可以是相對地址或絕對地址。在url中可以包含查詢參數,如“/api/data?id=1&name=test”。3、data:發送到服務器的數據,可以是字符串、對象或數組等格式。data可以是一個字符串、對象或數組等格式。如果是一個對象,會自動轉換4、為查詢參數的格式,如“id=1&name=test”。如果是一個數組,會將每個元素作為一個查詢參數,如“ids[]=1&ids[]=2&ids[]=3”。5、dataType:服務器返回的數據類型,常見的數據類型有xml、json、html、text等。根據dataType的值,jQuery會自動將服務器返回的數
據進行解析,以便JavaScript程序能夠方便地使用。6、success:請求成功時的回調函數。可以在這個函數中對返回的數據進行處理。success函數接收一個參數data,表示服務器返回的數據。7、error:請求失敗時的回調函數。可以在這個函數中處理錯誤。error函數接收三個參數:xhr表示XMLHttpRequest對象,status表示錯誤
的狀態碼,error表示錯誤的描述信息。8、beforeSend:發送請求前的回調函數,可以在這個函數中對請求進行處理,如添加請求頭信息。beforeSend函數接收一個XMLHttpRequest
對象作為參數,可以在這個對象上設置請求頭信息等。9、complete:請求完成后的回調函數,無論請求成功或失敗都會執行。complete函數接收一個XMLHttpRequest對象和一個表示請求狀態的字符串參數。
2、Get請求(JavaScript對象)
<script>var o = {key1: 'value1',key2: 'value2',yang: '12312312'}$.ajax({url: '/yyy',type: 'GET',data: o,// 其他參數...success: function(response) {// 處理成功的回調},error: function(error) {// 處理錯誤的回調}
});
3、Get請求(json字符串)
<script>var o = {key1: 'value1',key2: 'value2',yang: '12312312'}$.ajax({url: '/yyy',type: 'GET',data: JSON.stringify(o),//用于設置發送到服務器的數據的內容類型(Content-Type)contentType: 'application/json',// 其他參數...success: function(response) {// 處理成功的回調},error: function(error) {// 處理錯誤的回調}
});</script>
4、Post請求(JavaScript對象)
var o = {key1: 'value1',key2: 'value2',yang: '12312312'
}$.ajax({url: '/yyy',type: 'POST',data: o,// 其他參數...success: function(response) {// 處理成功的回調},error: function(error) {// 處理錯誤的回調}
});
5、Post請求(json字符串)
var o = {key1: 'value1',key2: 'value2',yang: '12312312'
}$.ajax({url: '/yyy',type: 'POST',data: JSON.stringify(o),//用于設置發送到服務器的數據的內容類型(Content-Type)contentType: 'application/json',// 其他參數...success: function(response) {// 處理成功的回調},error: function(error) {// 處理錯誤的回調}
});
6、注意事項
6.1、contentType: ‘application/json’, 為什么 只能用post方法接受?
contentType: 'application/json' 通常與 POST 方法一起使用的原因是,它指定了請求體中數據的編碼類型為 JSON 格式。這種設置表明請求體中包含的數據是一個 JSON 字符串,而不是標準的表單數據。在服務器端,你通常需要根據請求頭中的 Content-Type 值來正確解析請求的數據。GET 請求通常將數據附加到 URL 的查詢字符串中,而不是放在請求體中,因此在這種情況下,設置 contentType: 'application/json' 并不是很有意義,因為 GET 請求通常不包含請求體。當使用 POST 請求時,數據可以包含在請求體中,而不會暴露在 URL 中。因此,當你想要向服務器發送 JSON 格式的數據時,通常使用 POST 請求,并設置 contentType: 'application/json'。
6.2、HttpServletRequest.getParameter可以接受的數據
var o = {key1: 'value1',key2: 'value2',yang: '12312312'}$.ajax({url: '/yyy',//GET、POST、GET直接拼接、form表單type: 'POST',data: o,success: function(response) {// 處理成功的回調},error: function(error) {// 處理錯誤的回調}});
6.3、前端傳遞:json數據,java接收
Content-Type(通常是"application/json)
6.3.1、springWeb項目獲取
用注解 @RequestBody
@RestController
public class MyController {@PostMapping("/receiveJson")public String receiveJson(@RequestBody MyData myData) {// 在這里處理接收到的JSON數據String name = myData.getName();int age = myData.getAge();// 進行業務邏輯處理return "JSON data received successfully!";}
}
6.3.2、Servlet中處理請求:獲取
在這個例子中,request.getInputStream()用于獲取請求的輸入流,然后使用BufferedReader從輸入流中讀取JSON數據。這種方法適用于POST請求,其中JSON數據是通過請求體發送的。請注意,這是一個基本的例子,實際應用中可能需要進行錯誤處理、數據驗證等。確保前端通過POST請求以正確的方式發送JSON數據,例如設置正確的Content-Type頭部(通常是"application/json")。如果你的應用使用Spring框架,推薦使用Spring提供的@RequestBody注解,因為它會自動處理JSON到對象的轉換,并提供更方便的方式來處理請求。
@WebServlet("/receiveJson")
public class MyServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 從請求中獲取輸入流InputStream inputStream = request.getInputStream();// 從輸入流中讀取JSON數據String jsonString = new BufferedReader(new InputStreamReader(inputStream)).lines().collect(Collectors.joining("\n"));// 在這里處理接收到的JSON數據System.out.println("Received JSON: " + jsonString);// 進行業務邏輯處理// 返回響應response.getWriter().write("JSON data received successfully!");}
}
6.4、載荷:表單數據、請求負載
- 載荷
"載荷"(payload)是一個通用術語,用于表示在計算機系統中傳輸的有效數據。在不同的上下文中,"載荷" 可以指代不同類型的數據。在 HTTP 請求的背景下,"載荷" 通常用于描述請求體中的數據。
- 表單數據
在 Web 開發中,"表單數據" 通常指的是通過 HTML 表單提交的數據。當用戶填寫表單并點擊提交按鈕時,瀏覽器將用戶輸入的數據封裝成一個表單數據的集合,并通過 HTTP 請求將這些數據發送到服務器。這些表單數據可以使用不同的編碼方式,最常見的是 application/x-www-form-urlencoded 編碼,它將數據編碼為鍵值對的形式,類似于 URL 查詢字符串。另一種是 multipart/form-data 編碼,通常用于文件上傳。表單數據在請求體中以鍵值對的形式出現,例如 name=value。
- 請求負載(Request Payload)
"請求負載" 是一個更通用的術語,指的是 HTTP 請求體中包含的所有數據,不僅僅局限于表單數據。它可以包含任何類型的數據,包括文本、二進制、JSON、XML 等。當使用 Ajax 或其他方式發送數據到服務器時,數據被包含在請求負載中。這可以是任何格式,取決于請求的內容類型(Content-Type)。如果請求負載是 JSON 格式的數據,通常使用 application/json 作為 Content-Type。在這種情況下,請求體中的數據是 JSON 字符串。
6.5、request.getInputStream() 讀取的是哪里的數據?
request.getInputStream() 方法從 HTTP 請求的主體(body)中獲取輸入流。
在 HTTP 請求中,請求主體包含了請求的具體數據,例如 POST 請求中的表單數據或 JSON 數據。當客戶端發送一個包含主體的 HTTP 請求時,請求主體的內容就會通過這個輸入流傳輸到服務器端。在服務端,你可以使用 request.getInputStream() 來讀取這個輸入流,從而獲取請求主體中的數據。對于 POST 請求而言,特別是使用 "application/x-www-form-urlencoded" 或 "multipart/form-data" 格式提交的表單數據,這些數據通常被包含在請求主體中。對于 JSON 數據,它也可以作為請求主體的一部分被發送。需要注意的是,對于 GET 請求,通常不會包含請求主體,而是將參數附加在 URL 的查詢字符串中。在這種情況下,不需要使用 request.getInputStream() 來獲取數據,而是可以使用 request.getParameter() 方法來獲取 URL 中的參數。
6.6、ajax 的post默認 是以什么格式提交?
默認情況下,使用Ajax的POST請求時,數據以"application/x-www-form-urlencoded"格式提交。
這是因為jQuery等Ajax庫的默認設置是將數據編碼為這種形式,這種編碼適用于普通的表單提交。這種格式要求將數據編碼成鍵值對的形式,每個鍵值對之間使用&符號分隔,而鍵和值之間使用等號(=)分隔。
例如,一個包含name和age參數的POST請求體可能如下所示:
name=John&age=30
如果你想要以JSON格式提交數據,你需要顯式地設置
Content-Type
為"application/json",并將數據以JSON字符串的形式發送。例如,使用jQuery的
$.ajax
方法:
$.ajax({url: 'your-api-endpoint',type: 'POST',contentType: 'application/json',data: JSON.stringify({key1: 'value1',key2: 'value2'}),success: function(response) {// 處理響應},error: function(error) {// 處理錯誤}
});
在這個例子中,contentType: 'application/json'設置了請求的Content-Type,而data: JSON.stringify({...})將數據轉換為JSON字符串。
這樣發送的請求體將以JSON格式進行編碼。