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配置:

1
2
3
<action name= "querySalaryByKeyForApp"  class = "salaryAction"  method= "querySalaryByKeyForApp" >
             <result name= "success" >jsonp.jsp</result>
         </action>

jsonp.jsp

1
2
3
4
5
6
7
8
<%@ 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+")");
%>

方法实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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( "您的薪资数据未录入,新联系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转换:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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(); //应发工资
     JSONObject buckleInfo =  new  JSONObject(); //实扣工资
     JSONObject realInfo =  new  JSONObject(); //实发工资
     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形式提供:

wKiom1bmfKiTyD_nAAIcMLZeHOM855.jpg




     本文转自 gaochaojs 51CTO博客,原文链接:http://blog.51cto.com/jncumter/1750964,如需转载请自行联系原作者



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值