jsonP格式接口实现
单位开发了一个app系统,app外包,服务由自开发的薪资查询系统提供。app与后端交互采用jsonp解决跨域问题。
JSONP的实现,需要加上一个callback,JSONP和普通JSON的区别在于普通JSON,返回时
out.write("{name:'Xie Feng'}");
而jsonp的返回则是
out.write("callback({name:'Xie Feng'}");
callback实际是一个js端的函数名称,双方可以任意约定
所以对于服务器端唯一区别在于,返回的string多一个callback(xxxx)
jsonp只能使用get请求,解决同源问题,返回javascript代码,因为请求javascript文件是没有同源问题的。
当请求数据类型为jsonp时,会将callback=jsonpCallback加在url上,http://localhost:8090/api/testcallback=jsonpCallback
前台javascript中定义jsonpCallback函数,此函数必须定义在window下,也就是全局的函数,否则找不到。
后台获取请求的callback参数值jsonpCallback,返回字符串"jsonpCallback(result)",result为返回结果。
请求返回的是script tag,首先会调用jsonpCallback函数,不管是否找到该函数,都会调用success函数。
如果没有定义jsonp和jsonpCallback,jsonp默认为"callback",jsonpCallback会是Jquery自动生成的函数名。
可以参考例子。
代码如下,struts配置:
<actionname="querySalaryByKeyForApp"class="salaryAction"method="querySalaryByKeyForApp"><resultname="success">jsonp.jsp</result></action>
jsonp.jsp
<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%Stringjsoncallback=request.getParameter("callback");StringjsonResult=(String)request.getAttribute("salaryResult");out.println("callback("+jsonResult+")");%>
方法实现
publicStringquerySalaryByKeyForApp(){try{SalUserEntitysalUserQuery=newSalUserEntity();if(salaryVo==null||salaryVo.getSalaryEntity()==null){salaryResult="{errorMsg:错误}";returnSUCCESS;}StringstaffId=salaryVo.getSalaryEntity().getStaffId();Stringyear=salaryVo.getSalaryEntity().getYear();Stringmonth=salaryVo.getSalaryEntity().getMonth();Stringpassword=salaryVo.getSalaryEntity().getPassword();if(StringUtils.isEmpty(staffId)||StringUtils.isEmpty(year)||StringUtils.isEmpty(month)||StringUtils.isEmpty(password)){salaryResult="{errorMsg:错误}";returnSUCCESS;}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){thrownewSalaryException("您的薪资数据未录入,新联系HR!");}List<Map<String,Object>>valueMap=entity2ListOfMap(entities.get(0));JSONArrayjsonObject=JSONArray.fromObject(valueMap);salaryResult=jsonObject.toString();//jsonObject.accumulate("jsonObject",entities.get(0));//salaryVo.setSalaryEntity(entities.get(0));returnSUCCESS;}else{salaryResult="{errorMsg:错误}";returnSUCCESS;}}catch(Exceptione){salaryResult="{errorMsg:错误}";returnSUCCESS;}//returnERROR;}
json转换:
privateJSONArrayentity2ListOfMap(SalaryEntitysalary){if(salary==null){salary=newSalaryEntity();returnentity2ListOfMap(salary);}JSONArrayresult=newJSONArray();JSONObjectbasicInfo=newJSONObject();//基本信息JSONObjectwageInfo=newJSONObject();//应发工资JSONObjectbuckleInfo=newJSONObject();//实扣工资JSONObjectrealInfo=newJSONObject();//实发工资JSONObjectgscdInfo=newJSONObject();//公司承担JSONArraybasicMap=newJSONArray();JSONArraywageMap=newJSONArray();JSONArraybuckleMap=newJSONArray();JSONArrayrealMap=newJSONArray();JSONArraygscdMap=newJSONArray();JSONObjectjsonObjectgh=newJSONObject();jsonObjectgh.put("name","工号");jsonObjectgh.put("value",salary.getStaffId());basicMap.add(jsonObjectgh);JSONObjectjsonObjectxm=newJSONObject();jsonObjectxm.put("name","姓名");jsonObjectxm.put("value",salary.getStaffName());basicMap.add(jsonObjectxm);JSONObjectjsonObjectbm=newJSONObject();jsonObjectbm.put("name","部门");jsonObjectbm.put("value",salary.getDept());basicMap.add(jsonObjectbm);JSONObjectjsonObjectks=newJSONObject();jsonObjectks.put("name","科室");jsonObjectks.put("value",salary.getClass_());basicMap.add(jsonObjectks);JSONObjectjsonObjectnf=newJSONObject();jsonObjectnf.put("name","年份");jsonObjectnf.put("value",salary.getYear());basicMap.add(jsonObjectnf);JSONObjectjsonObjectyf=newJSONObject();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);returnresult;}
接口用http形式提供:
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。