ajax與后台進行數據交互的幾種常用方式(最全)


1.get請求

  方式一:$.ajax{()}

$.ajax({
	type : 'get',// 請求方式,可以不聲明該屬性,默認值就是get
	url : 'getParams',// 請求地址
	data : {// 請求數據,這個參數可以去掉,也就是只發送請求不攜帶數據
		name : 'Marydon',
		work : '程序員'
	},
	success : function(result){// 請求成功
		alert(result);
	},
	error : function(result){// 請求失敗,這個參數一般情況系不攜帶
		alert(result);
	}
});

  說明:當是get類型時,可以不聲明type,默認請求方式就是get請求

  方式二:$.get();

$.get('getParams',// 請求地址
{// 請求數據
	name : 111,
	work : '程序員'
}, 
function(result) {// 請求成功
	alert(result);
});  

  方式三:$.getJSON();

$.getJSON('getParams',// 請求地址
{// 請求數據
	name : 'Marydon',
	work : '程序員'
}, 
function(result) {// 請求成功,要求返回的數據必須是json格式的字符串,返回其它類型數據接收不到
	alert(JSON.stringify(result));
});

  后台返回json數據及前台對應的接收方式

  方式一:返回json字符串

  當后台沒有指定返回數據格式為application/json數據時,默認是text/html文本數據,ajax將會根據Content-Type屬性自動將dataType屬性的值設置為:text,也就是按照字符串來解析返回的數據。

  后台響應

// 告訴瀏覽器以指定的字符集進行解析返回數據
response.setCharacterEncoding("utf-8");
// 后台不指定響應數據格式
JSONObject json = new JSONObject();
json.put("name", request.getParameter("name"));
json.put("work", work);
// 返回json字符串
response.getWriter().append(json.toString());  

  前端接收:兩種情況

  除$.getJSON()以外的ajax接收到的是json字符串,又可以划分為兩種接收方式

  第一種:需要手動將其轉換成json對象

$.ajax({
	type : 'post',// 請求方式
	url : 'getParams',// 請求地址
	data : {'name' : 'Marydon','work' : '程序員'},// 請求數據
	success : function(result){// json字符串
		// json字符串轉json對象
		// 方式一:eval()
		var json = eval('(' + result + ')');
		// 方式二:JSON.parse()
// 		var json = JSON.parse(result);
		alert(json.work);
	}
});

  第二種:指定返回數據是json

$.ajax({
	type : 'get',// 請求方式
	url : 'getParams',// 請求地址
	data : {'name' : 'Marydon','work' : '程序員'},
	dataType : 'json',// 指定返回類型為json數據
	success : function(result){// 請求成功
		alert(result.work);
	}
});
$.get('getParams',// 請求地址
	 {// 請求數據
		 name : 111,
		 work : '程序員'
	 }, 
	 function(result) {// 請求成功
		 alert(result.work);
	 },
	'json');// 返回數據類型設置必須放在最后

  $.getJSON()可以接收到返回的json字符串,並自動將其轉換成json對象

$.getJSON(
       'getParams',// 請求地址
	 { name : 'Marydon', work : '程序員' }, 
	 function(result) {// 自動將json字符串轉化成json對象
          alert(result.work);
	 });  

  $.getJSON()就不需要聲明啦,因為它的值已經被指定為了'json'。

  需要注意的是$.get()和$.post()添加'json'時的位置必須在最后一位。因為語法形如:$.post(url,[data],[callback],['json'])

  方式二:返回json對象

  后台響應

// 告訴瀏覽器以json對象來處理返回的數據
response.setHeader("content-type","application/json;charset=utf-8");
JSONObject json = new JSONObject();
json.put("name", request.getParameter("name"));
json.put("work", work);
response.getWriter().append(json.toString());

  前端接收  

  前端接收到的就是JSON對象,不需要再處理。  

  小結:

  第一,$get()和$getJSON()的區別;$.getJSON()不能聲明dataType屬性,因為它的值已經被指定為JSON,只有當返回的數據是json字符串或者json對象時,才會接收;而dataType的值,jQuery會自動根據返回類型進行設置,一般無需手動聲明,其它地方一模一樣。

  第二,$get()、$getJSON()和$.ajax({})的區別;前兩者只能設置url、data、success這三個屬性,當這三個屬性不能滿足需求時,就必須使用$.ajax({})了。

  第三,關於ajax get請求攜帶數據的本質;get請求的本質就是:url?param1=value1&param2=value2&...,所以,我們可以去掉data屬性,直接在url后面拼接參數即可。例如:

var param = "name=Marydon&work=" + encodeURI('程序員');// 手動拼接需要編碼2次,后台解碼1次
$.get(
		'getParams?' + param,// 請求地址+?+請求數據 
		function(result) {// 請求成功
			alert(result);
		});  

  第四,get請求導致的中文亂碼問題,主要分為兩種情況:

  首先,需要明白的是:get請求,瀏覽器設置的字符集是ISO-8859-1,所以中文傳輸到后台會導致亂碼,因為后台是以UTF-8進行接收參數的。

  第一種情況對應解決方案:使用原生的ajax攜帶數據

  方式一,后台轉碼:new String(work.getBytes("iso-8859-1"), "utf-8");;

  方式二,前端編碼-work : encodeURI('程序員'),后台解碼-URLDecoder.decode(work, "utf-8")。(推薦使用)

  第二種情況對應解決方案:手動拼接key=value,傳輸數據

  方式一:前台編碼一次:work=encodeURI('程序員');,后台轉碼:new String(work.getBytes("iso-8859-1"), "utf-8");

  方式二:前台手動編碼兩次:work=encodeURI(encodeURI('程序員')),后台解碼一次:URLDecoder.decode(work, "utf-8")。(推薦使用) 

  區分不同情況的原因是:

  使用ajax的data屬性傳遞數據時,get請求會自動對中文進行一次編碼,tomcat對其解碼一次,其本質還是ISO-8859-1,所以有兩種解決方式;

  自己手動拼接的話,get請求將不會自動對中文進行一次編碼,而tomcat高版本url中不允許帶中文,所以至少需要手動編碼一次,同樣的,tomcat會對其解碼一次,所以也有兩種解決方式;

2.post請求

  方式一:$.ajax{()}

$.ajax({
	type : 'post',// 請求方式,不聲明該屬性時,默認值是get請求
	url : 'getParams',// 請求地址
	data : {// 請求數據,這個參數可以去掉,也就是只發送請求不攜帶數據
		name : 'Marydon',
		work : '程序員'
	},
	success : function(result){// 請求成功
		alert(result);
	},
	error : function(result){// 請求失敗,這個參數一般情況系不攜帶
		alert(result);
	}
});

  方式二:$.post()

$.post('getParams',// 請求地址
{// 請求數據
	name : 111,
	work : '程序員'
}, 
function(result) {// 請求成功
	alert(result);
});  

  post請求不存在亂碼問題。

3.總結

  第一,通常情況下,用來表示值的數據有兩種類型:string和number,如果是數值類型,則不需要使用雙引號或者單引號;如果是字符串類型,必須使用單引號或者雙引號括住,否則,它將代表的是一個變量而不是一個具體的數據類型,舉例說明:

  data : { name : 'Marydon'},此時的Marydon是一個string類型的字符串;

  data : { name : Marydon},此時的Marydon是一個變量,必須在該代碼出現前面已經聲明了該變量,即var Marydon;,否則js運行時將會報錯:找不到該變量;

  data : { name : 111},這個就比較簡單了,我們一眼就能看出它是數值類型,但是數據在傳輸時,參數值均會被轉換成字符串String來傳輸;后台在接收該參數時用String類型來接收。

  第二,關於請求數據格式

  data : { key : value},key既可以不帶引號,也可以帶引號,單引號或者雙引號也都可以,value也一樣。

4.擴展用法

第一,跨域cookie傳遞

  使用xhrFields屬性可以解決跨域cookie傳遞問題:即能將客戶端的cookie傳遞給服務器。

  xhrFields:{withCredentials:true};

  當然,服務器端也需要做相應的設置才行,具體詳見文章:java、ajax 跨域請求解決方案,第五部分

第二,使用ajax提交文件

  方式一:使用原生的XMLHttpRequest對象進行提交

  前端發送數據

<input type="file" id="file" onchange="upload('getParams')" style="display: none;">
<input type="button" value="上傳" onclick='javascript:$("#file").click()'>  
function upload(url) {
    // js 獲取文件對象
    var fileObj = document.getElementById("file").files[0];
    if (null == fileObj) {
        alert("圖像上傳失敗,請重試!");
        return;
    }
    // 創建form表單
    var formFile = new FormData();
    // 加入文件對象
    formFile.append("file", fileObj);
    // 創建XMLHttpRequest對象
    var xhr = new XMLHttpRequest();
    // post方式,url為服務器請求地址,true 該參數規定請求是否異步處理。
    xhr.open("post", url, true);
    //請求完成
    xhr.onload = function () {
        // 將返回數據轉換成JSON對象
        var resData = JSON.parse(this.responseText);
        document.getElementById("file").value = "";
    };
    // 請求失敗
    xhr.onerror = null;
    // 上傳進度調用方法(可實現上傳進度條)
    xhr.upload.onprogress = null;
    // //開始上傳,發送form數據(以二進制數據傳遞給后台)
    xhr.send(formFile);
}

  后台接收

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    InputStream is = request.getInputStream();
    int i = 0;
    while ((i = is.read()) != -1) {
        System.out.print((char) i);
    }
}

  方式二:$.ajaxFileUpload

  准備工作:jQuery.js和ajaxfileupload.js

$.ajaxFileUpload({
                fileElementId: fileId,    //需要上傳的文件域的ID,即<input type="file">的ID。
                url: path, //后台方法的路徑
                type: 'post',   //當要提交自定義參數時,這個參數要設置成post
                dataType: 'json',   //服務器返回的數據類型。可以為xml,script,json,html。如果不填寫,jQuery會自動判斷。
                secureuri: false,   //是否啟用安全提交,默認為false。
                async : true,   //是否是異步
                success: function(data) {   //提交成功后自動執行的處理函數,參數data就是服務器返回的數據。
                    
                },
                error: function(data, status, e) {  //提交失敗自動執行的處理函數。
                    console.error(e);
                }
            });

  原理:創建一個隱藏的表單和iframe然后用JS去提交,獲得返回值

  使用jQuery的好處在於:可以實現異步提交文件

  方式三:FileReader+ajax

// 圖片正則表達式
var rFilter = /^(?:image\/bmp|image\/cis\-cod|image\/gif|image\/ief|image\/jpeg|image\/jpeg|image\/jpeg|image\/pipeg|image\/png|image\/svg\+xml|image\/tiff|image\/x\-cmu\-raster|image\/x\-cmx|image\/x\-icon|image\/x\-portable\-anymap|image\/x\-portable\-bitmap|image\/x\-portable\-graymap|image\/x\-portable\-pixmap|image\/x\-rgb|image\/x\-xbitmap|image\/x\-xpixmap|image\/x\-xwindowdump)$/i;

// 文件校驗
if (document.getElementById("uploadImage").files.length === 0) {
    alert("請上傳圖像");
    return;
}
// js 獲取文件對象
var fileObj = document.getElementById("uploadImage").files[0];
// 格式校驗
if (!rFilter.test(fileObj.type)) {
    alert("必須是圖片格式文件!");
    return;
}
//判斷是否支持FileReader
if (window.FileReader) {
    // 創建文件讀取對象
    var reader = new FileReader();
} else {
    alert("您的設備不支持圖片上傳功能,如需該功能請升級您的設備或瀏覽器!");
    return;
}
// 圖片轉base64(Blob對象或File對象)
reader.readAsDataURL(fileObj);
reader.onload = function(e) {
    // 獲取對應的base64
    var imgBase64 = e.target.result;
    // 將圖片的base64碼傳給后台
    // 調用騰訊接口
    $.post(baseUrl + "/weixin/facein/upImg2.do",{imgBase64:imgBase64},function(resData){
        // TODO 對返回的接口數據進行自動填充處理
    });
};  

  注意:

  這種方法僅限圖片上傳,也就是只適用於圖片上傳;

  Internet Explorer 10 之前的版本並不支持FileReader();

  另外,window.FileReader更常用的方式是:圖片預覽,由於低版本IE瀏覽器不支持FileReader實現圖片預覽,但是卻可以通過濾鏡實現預覽,具體見文末推薦。

 

寫在最后

  哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!

 相關推薦:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM