您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“如何使用Springboot接收前端Ajax發送的json”,內容詳細,步驟清晰,細節處理妥當,希望這篇“如何使用Springboot接收前端Ajax發送的json”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
通過 https://start.spring.io/ 獲得項目框架。在eclipse中導入下載的Maven項目。
Maven添加fastjson依賴包
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency>
定義Controller
@RestController public class GetJsonReq { @CrossOrigin @RequestMapping(value = "/simple") // json的結構和內部字段名稱可以與POJO/DTO/javabean完全對應 public Map<String, String> getJsonBean(@RequestBody Beauty beauty) { Map<String, String> result = null; if (beauty != null) { System.out.println("美女的名字:" + beauty.getName()); System.out.println("美女的年齡:" + beauty.getAge()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("美女出道日期:" + sdf.format(beauty.getDate())); System.out.println("美女的收入:" + beauty.getSalary()); result = new HashMap<>(); result.put("code", "1"); result.put("msg", "ok"); } return result; } @CrossOrigin @RequestMapping(value = "/complex") //json的結構較為復雜,不直接與POJO/DTO/javabean對應。 public Map<String, String> getJsonComplex(@RequestBody JSONObject param) { Map<String, String> result = null; if (param != null) { JSONObject master = param.getJSONObject("master"); Beauty beauty = (Beauty) JSONObject.toJavaObject(master, Beauty.class); System.out.println(beauty); JSONArray mm = param.getJSONArray("MM"); for (int i = 0; i < mm.size(); i++) { // 這里不能使用get(i),因為get(i)只會得到鍵值對。 JSONObject json = mm.getJSONObject(i); Beauty bt = (Beauty) JSONObject.toJavaObject(json, Beauty.class); System.out.println(bt); } result = new HashMap<>(); result.put("code", "1"); result.put("msg", "ok"); } return result; } }
POJO/DTO/JavaBean
注意Date字段要如何處理。
public class Beauty { private String name; private int age; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date date; private double salary; public Beauty() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } @Override public String toString() { return "Beauty [name=" + name + ", age=" + age + ", date=" + date + ", salary=" + salary + "]"; } }
將JSON轉為Java對象使用@RequestBody 注解;將Java對象轉換為JSON使用@ResponseBody注解。
一旦使用@ResponseBody注解返回流程將不在經過視圖解析器,而是直接將數據寫入到輸出流中,通過response的body返回數據。如果處理請求方法返回的是 String 時@ResponseBody 注解不會進行 JSON 轉換。響應的 Content-Type 為 text/plain;charset=ISO-8859-1。如果處理請求方法返回的是除了 String 類型以外的其他Object 類型時,@ResponseBody注解會進行 JSON 轉換。響應的 Content-Type 為 application/json。
響應體的字符編碼需要在@RequestBody 注解中設定:
//@RequestMapping(value = "/addUsers",produces = "text/plain;charset=utf-8") 返回String //@RequestMapping(value = "/addUsers",produces = "application/json;charset=utf-8") 返回json對象 @RequestMapping(value = "/addUsers",produces = MediaType.APPLICATION_JSON_VALUE+";charset=utf-8") @ResponseBody @CrossOrigin(origins ="http://localhost:8888") public Object addUsers(@RequestBody Users users)throws Exception{ System.out.println(users); return users; }
借助jQuery來發送Ajax請求。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>發送json</title> <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js" type="text/javascript" charset="utf-8"></script> </head> <body> <script type="text/javascript">function send1() { var beauty = JSON.stringify({ //將JSON對象轉換為字符串 "name": "小甜甜", "age": 26, "salary": 200000, "date": "2019-08-05 08:04:13" }); $.ajax({ type: 'POST', url: "http://localhost:8080/simple", data: beauty, //beauty是字符串 contentType: "application/json", dataType: "json", success: function(message) { alert(JSON.stringify(message)) //將JSON對象轉換為字符串 } }); }; function send2() { var beauty = JSON.stringify({ "MM": [{ "name": "春花", "age": 27, "salary": 20000, "date": "2017-05-19 09:33:14" }, { "name": "秋香", "age": 30, "salary": 30000, "date": "2019-10-21 17:04:33" }], "master": { "name": "小甜甜", "age": 26, "salary": 200000, "date": "2019-08-05 08:04:13" } }); $.ajax({ type: "POST", url: "http://localhost:8080/complex", contentType: "application/json; charset=utf-8", data: beauty, dataType: "json", success: function(message) { alert("提交成功" + JSON.stringify(message)); }, error: function(message) { alert("提交失敗" + JSON.stringify(message)); } }); }</script> <input type="button" name="btn1" id="s1" onclick="send1()" value="發送簡單json" /> <br /> <hr /> <input type="button" name="btn2" id="s2" onclick="send2()" value="發送復雜json" /> </body> </html>
這里要注意:
script標簽引入js的形式必須是雙標簽,形如:
<script src="…js" …></script>
如果是形如<script src="…js" … />的單標簽,將無法引入js。頁面提交的數據默認content-type是application/x-www-form-urlcoded的編碼(鍵值對)。而@RequestBody注解只有在編碼為application/json時才能將JSON 格式的數據轉為 Java 對象。
對于jQuery一般是使用$.ajax來發送json請求,因為只有它可以設置編碼格式(application/json)。
HTML5中如何實現JSON對象與字符串之間的相互轉換?
//string -> json JSON.parse("...") //json -> string JSON.stringify(obj)
同源策略
ajax請求須受到同源策略的影響。
跨域請求
在 JavaScript 的請求中當一個請求 URL 的協議、域名、端口三者之間任意一個與當前頁面 URL 不同時即為跨域。
ajax請求如何受同源策略限制
一個頁面的URL(origin)與同一頁面中ajax訪問的URL出現跨域時,ajax請求被服務器端block。
處理方式
前端:jsonp(json with padding)
jsonp的原理就是script標簽不受同源策略的影響,所以通過script的src屬性來實現跨域。
//原生js var script = document.createElement("script"); script.src = "https://api.douban.com/v2/book/search?q=javascript&count=1&callback=handleResponse"; document.body.insertBefore(script, document.body.firstChild); //在頁面中,返回的JSON作為參數傳入回調函數中 functionhandleResponse(response){ // 對response數據進行操作代碼 } //jQuery GET $.ajax({ async : true, url : "https://api.douban.com/v2/book/search", type : "GET", dataType : "jsonp", // 返回的數據類型,設置為JSONP方式 jsonp : 'callback', //指定一個查詢參數名稱來覆蓋默認的 jsonp 回調參數名 callback jsonpCallback: 'handleResponse', //設置回調函數名 data : { q : "javascript", count : 1 }, success: function(response, status, xhr){ console.log('狀態為:' + status + ',狀態是:' + xhr.statusText); console.log(response); } }); //jQuery POST $.ajax({ url:'http://localhost:8888/other/other.jsp', type:'post', data:{'params':'fromjsonp'}, dataType: "jsonp", jsonp: "callback",//傳遞給請求處理程序或頁面的,用以獲得jsonp回調函數名的參數名(一般默認為:callback) success: function(data){ alert("through jsonp,receive data from other domain : "+data.result); }, error: function(){ alert('fail'); } });
后端:@CrossOrigin
@Controller @RequestMapping("/user") public class UsersController { @RequestMapping(value = "/addUsers",produces = MediaType.APPLICATION_JSON_VALUE+";charset=utf-8") @ResponseBody //限定發送 ajax的頁面的初始url,即origins(可多個origin url)。其他的不受理。 //不給出origins則處理所有origin url的跨域 ajax請求。 @CrossOrigin(origins ="http://localhost:8888") public Object addUsers(@RequestBody Users users)throws Exception{ System.out.println(users); return users; } }
讀到這里,這篇“如何使用Springboot接收前端Ajax發送的json”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。