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形式提供:

wKiom1bmfKiTyD_nAAIcMLZeHOM855.jpg

相关文章

文章浏览阅读2.4k次。最近要优化cesium里的热力图效果,浏览...
文章浏览阅读1.2w次,点赞3次,收藏19次。在 Python中读取 j...
文章浏览阅读1.4k次。首字母缩略词 API 代表应用程序编程接口...
文章浏览阅读802次,点赞10次,收藏10次。解决一个JSON反序列...
文章浏览阅读882次。Unity Json和Xml的序列化和反序列化_uni...