單位開發(fā)了一個app系統(tǒng),app外包,服務由自開發(fā)的薪資查詢系統(tǒng)提供。app與后端交互采用jsonp解決跨域問題。
JSONP的實現(xiàn),需要加上一個callback,JSONP和普通JSON的區(qū)別在于普通JSON,返回時
out.write("{name:'Xie Feng'}");
而jsonp的返回則是
out.write("callback({name:'Xie Feng'}");
callback實際是一個js端的函數(shù)名稱,雙方可以任意約定
所以對于服務器端唯一區(qū)別在于,返回的string多一個callback(xxxx)
jsonp只能使用get請求,解決同源問題,返回javascript代碼,因為請求javascript文件是沒有同源問題的。
當請求數(shù)據(jù)類型為jsonp時,會將callback=jsonpCallback加在url上,http://localhost:8090/api/testcallback=jsonpCallback
前臺javascript中定義jsonpCallback函數(shù),此函數(shù)必須定義在window下,也就是全局的函數(shù),否則找不到。
后臺獲取請求的callback參數(shù)值jsonpCallback,返回字符串"jsonpCallback(result)",result為返回結果。
請求返回的是script tag,首先會調用jsonpCallback函數(shù),不管是否找到該函數(shù),都會調用success函數(shù)。
如果沒有定義jsonp和jsonpCallback,jsonp默認為"callback",jsonpCallback會是Jquery自動生成的函數(shù)名。
可以參考例子。
代碼如下,struts配置:
<action name="querySalaryByKeyForApp" class="salaryAction" method="querySalaryByKeyForApp"> <result name="success">jsonp.jsp</result> </action>
jsonp.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String jsoncallback = request.getParameter("callback"); String jsonResult = (String)request.getAttribute("salaryResult"); out.println("callback("+jsonResult+")"); %>
方法實現(xiàn)
public String querySalaryByKeyForApp() { try{ SalUserEntity salUserQuery = new SalUserEntity(); if(salaryVo == null || salaryVo.getSalaryEntity() == null){ salaryResult = "{errorMsg : 錯誤}"; return SUCCESS; } String staffId = salaryVo.getSalaryEntity().getStaffId(); String year = salaryVo.getSalaryEntity().getYear(); String month = salaryVo.getSalaryEntity().getMonth(); String password = salaryVo.getSalaryEntity().getPassword(); if(StringUtils.isEmpty(staffId) || StringUtils.isEmpty(year) || StringUtils.isEmpty(month) || StringUtils.isEmpty(password)){ salaryResult = "{errorMsg : 錯誤}"; return SUCCESS; } salUserQuery.setStaffId(staffId); salUserQuery.setPassword(password); if(salUserService.valUser(salUserQuery)){ salUserService.valUser(salUserQuery); List<SalaryEntity> entities = salaryService.querySalaryList(salaryVo.getSalaryEntity()); if(entities == null || entities.size() != 1){ throw new SalaryException("您的薪資數(shù)據(jù)未錄入,新聯(lián)系HR!"); } List<Map<String, Object>> valueMap = entity2ListOfMap(entities.get(0)); JSONArray jsonObject = JSONArray.fromObject(valueMap); salaryResult = jsonObject.toString(); // jsonObject.accumulate("jsonObject",entities.get(0)); // salaryVo.setSalaryEntity(entities.get(0)); return SUCCESS; } else { salaryResult = "{errorMsg : 錯誤}"; return SUCCESS; } }catch (Exception e) { salaryResult = "{errorMsg : 錯誤}"; return SUCCESS; } //return ERROR; }
json轉換:
private JSONArray entity2ListOfMap(SalaryEntity salary) { if(salary == null){ salary = new SalaryEntity(); return entity2ListOfMap(salary); } JSONArray result = new JSONArray(); JSONObject basicInfo = new JSONObject();//基本信息 JSONObject wageInfo = new JSONObject();//應發(fā)工資 JSONObject buckleInfo = new JSONObject();//實扣工資 JSONObject realInfo = new JSONObject();//實發(fā)工資 JSONObject gscdInfo = new JSONObject();//公司承擔 JSONArray basicMap = new JSONArray(); JSONArray wageMap = new JSONArray(); JSONArray buckleMap = new JSONArray(); JSONArray realMap = new JSONArray(); JSONArray gscdMap = new JSONArray(); JSONObject jsonObjectgh = new JSONObject(); jsonObjectgh.put("name", "工號"); jsonObjectgh.put("value",salary.getStaffId()); basicMap.add(jsonObjectgh); JSONObject jsonObjectxm = new JSONObject(); jsonObjectxm.put("name", "姓名"); jsonObjectxm.put("value",salary.getStaffName()); basicMap.add(jsonObjectxm); JSONObject jsonObjectbm = new JSONObject(); jsonObjectbm.put("name", "部門"); jsonObjectbm.put("value",salary.getDept()); basicMap.add(jsonObjectbm); JSONObject jsonObjectks = new JSONObject(); jsonObjectks.put("name", "科室"); jsonObjectks.put("value",salary.getClass_()); basicMap.add(jsonObjectks); JSONObject jsonObjectnf = new JSONObject(); jsonObjectnf.put("name", "年份"); jsonObjectnf.put("value",salary.getYear()); basicMap.add(jsonObjectnf); JSONObject jsonObjectyf = new JSONObject(); jsonObjectyf.put("name", "月份"); jsonObjectyf.put("value",salary.getMonth()); basicMap.add(jsonObjectyf); basicInfo.put("category", "基本信息"); basicInfo.put("id", "info"); basicInfo.put("items", basicMap); result.add(basicInfo); return result; }
接口用http形式提供:
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網絡助力業(yè)務部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調度,確保服務器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務器買多久送多久。
文章名稱:jsonP格式接口實現(xiàn)-創(chuàng)新互聯(lián)
分享網址:http://chinadenli.net/article22/dosgcc.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供移動網站建設、軟件開發(fā)、網頁設計公司、企業(yè)建站、App設計、微信公眾號
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)