在開發(fā) web 應(yīng)用程序時(shí),我們通常需要使用 Ajax 調(diào)用。與服務(wù)器進(jìn)行 Ajax 請(qǐng)求時(shí),JavaScript 代碼使用 HTTP 請(qǐng)求發(fā)送到服務(wù)器,然后服務(wù)器將響應(yīng)發(fā)送回 JavaScript,這樣 JavaScript 能夠直接處理響應(yīng)并根據(jù)需要更新頁(yè)面的內(nèi)容。但是,出于安全原因,瀏覽器不允許在其他域上使用 Ajax 請(qǐng)求,因此我們需要使用 JSONP 跨域請(qǐng)求,它可以用于從另一個(gè)域獲取 JSON 數(shù)據(jù)。
JSONP 是一個(gè)允許跨域請(qǐng)求的技術(shù),在獲取 JSON 數(shù)據(jù)時(shí),它可以使用 JSONP 回調(diào)函數(shù)包裝響應(yīng)數(shù)據(jù),然后將其作為參數(shù)傳遞給回調(diào)函數(shù),這樣 JavaScript 代碼就可以輕松地調(diào)用響應(yīng)并解析 JSON 數(shù)據(jù)了。
在 Java 中,我們可以使用以下代碼將響應(yīng)轉(zhuǎn)換為 JSONP:
String callback = request.getParameter("callback"); response.setContentType("application/javascript"); response.setCharacterEncoding("UTF-8"); String json = "{\"name\":\"jack\",\"age\":20}"; // 假設(shè) json 數(shù)據(jù)為這個(gè) String result = callback + "(" + json + ");"; response.getWriter().write(result);
在上面的代碼中,我們獲取回調(diào)函數(shù)名稱并設(shè)置響應(yīng)類型為 JavaScript,然后將 JSON 數(shù)據(jù)包裝到回調(diào)函數(shù)中并將其作為響應(yīng)發(fā)送回 JavaScript。
在使用 JSONP 請(qǐng)求轉(zhuǎn)換響應(yīng)為 JSON 時(shí),我們需要注意以下幾點(diǎn):
- 響應(yīng)必須是合法的 JSON 數(shù)據(jù)
- 必須包含回調(diào)函數(shù)名稱參數(shù)
- 響應(yīng)類型必須是 JavaScript
- 必須將 JSON 數(shù)據(jù)包裝在回調(diào)函數(shù)中