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

<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+")");
%>

方法实现

	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转换:

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

时间: 2024-10-24 08:35:54

jsonP格式接口实现的相关文章

php 实现 jsonp 数据接口

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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 <?php /**

Jquery调用从ashx文件返回的jsonp格式的数据处理实例

开发环境:vs2010+jquery-1.4.min.js 解决问题:网上代码比较少,好多调试不通,返回数据不用json而用jsonp主要考虑解决跨域问题 开发步骤:打开VS2010,新建一web站点,保存位置选择D:\Website1;添加新项,选择一般处理程序,命名cmdHandler.ashx;添加新项,选择HTML页,命名为testAshx.htm;网上下载jquery-1.4.min.js拷贝到web站点中 项目相关网站源码和运行截图如下: 1.testAshx.htm代码如下: <!

jquery中的跨域-jsonp格式

js要跨域jsonp格式,原理就是在html中插入一端js引用去调用远程地址: <script type="text/javascript" src="http://xxx.aspx?callback=test"></script> jquery客户端代码如下: $.ajax({ type:'get', url:'http://xxxx.ashx', dataType:'jsonp', jsonpCallback参数表示服务器返回数据的标志

PHP 开放JSON格式接口实例

转化JSON文件 <?php function arrayRecursive(&$array, $function, $apply_to_keys_also = false) { static $recursive_counter = 0; if (++$recursive_counter > 1000) { die('possible deep recursion attack'); } foreach ($array as $key => $value) { if (is_a

js跨越请求的2中实现 JSONP /后端接口设置运行跨越header

由于浏览器同源策略,a域名的js向b域名ajax请求会被禁止.JS实现跨越访问接口有2中办法. 1.后端接口设置允许跨越的header头. //header('Access-Control-Allow-Origin:*'); //支持全域名访问,不安全,部署后需要固定限制为客户端网址 header('Access-Control-Allow-Origin:http://www.example-a.com'); //设置的是带协议的url,而不是一个域名.可以设置多个url,用逗号分隔 echo

在vue中使用axios实现跨域请求并且设置返回的数据的格式是json格式,不是jsonp格式

在vue中使用axios实现跨域请求 需求分析:在项目中需要抓取qq音乐的歌曲列表的数据,由于要请求数据的地址url=https://c.y.qq.com/splcloud/fcgi-bin/fcg_get_diss_by_tag.fcg.从qq音乐的官网上可以看到该请求的请求头中的referer中的域名是y.qq.com(发送请求页面的域名),而host的域名是c.y.qq.com(被请求页面的域名),由于两者不一样,所以不能通过前端直接发送请求给qq服务器去拿数据.这时候需要服务器做一个代理

jsonp 格式

jQuery(document).ready(function(){ $.ajax({ type: "get", async: false, url: "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998", dataType: "jsonp", jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为

webservice jsonp格式调用

前端 $.ajax({            type: "get",            url: "http://baiduzd.yihu.com.cn/APIService.asmx/GetHospitalStatus",            dataType: "jsonp",            jsonp: 'callback',              data: { "HospitalID": 1111

ajax跨域传输(jsonp格式)

先抛个列子,转载自http://www.cnblogs.com/xcxc/p/3729660.html test.html <!doctype html> <html> <head> <meta charset="utf-8"> <title>test</title> <script src="jquery-1.5.2.min.js"></script> <scri