工作中,使用webService 以及 rmi 进行远程接口调用, 经常出现 连接不上的 问题.
于是想到利用url直接post或者get方式,提交给其他系统去做处理.
//jsonp跨域时候使用的参数
private static final String CALLBACK = "callback" ;
//通过actionName来判断对方要调用我们的什么接口
private static final String ACTION_NAME = "actionName" ;
//接口调用完毕之后,返回给对方的参数名称
private static final String KEY_RESULT = "result" ;
//接口调用完毕之后,返回给对方的参数名称,这个message只有出错的时候才会有值
private static final String KEY_MESSAGE = "message" ;
//对方传过来的url的参数名称
private String requestData ;
public String getRequestData() {
return requestData;
}
public void setRequestData(String requestData) {
this.requestData = requestData;
}
//成功调用接口后,返回 RESP_SUCCESS_JSON
private static final JSONObject RESP_SUCCESS_JSON;
static{
// 初始化固定的json结果
// success json
JSONObject json = new JSONObject();
json.put(KEY_RESULT, SUCCESS);
RESP_SUCCESS_JSON = json;
}
//调用接口失败后,返回的结果
private JSONObject getErrorJson(String msg){
JSONObject ret = new JSONObject();
ret.put(KEY_RESULT, ERROR);
ret.put(KEY_MESSAGE, msg);
return ret;
}
public String execute() throws Exception{
// 解析请求数据
JSONObject reqJson;
String action = "" ;
jsonp = this.getHttpServletRequest().getParameter(CALLBACK);
try{
//取出对方传过来的参数值,一串json
reqJson = JSONObject.fromObject(requestData);
// 取出action
action = StringUtils.trimToEmpty(reqJson.getString(ACTION_NAME));
}catch (Exception e) {
outputResultJson(getErrorJson("解析json请求错!" + e.getMessage()));
return null;
}
// 执行接口action
JSONObject respJson = new JSONObject();
try{
logger.info("xx系统调用接口:" + action);
logger.info("传入JSON:" + requestData);
//根据不同的actionName 调用不同的处理方法
if(action.equalsIgnoreCase("UpdateApply")){
// 申请表数据修改
respJson = updateApply(reqJson.getJSONObject(KEY_DATA));
}else if(action.equalsIgnoreCase("RateNotice")){
// 合同费率通知
// TODO 优先级稍低 郝晶说先不做
respJson = rateNotice(reqJson.getJSONObject(KEY_DATA));
}else if(action.equalsIgnoreCase("PickReport")){
// 调阅审核报告
respJson = pickReport(reqJson.getJSONObject(KEY_DATA));
}else if(action.equalsIgnoreCase("AddBlackList")){
// 加入黑名单
respJson = addBlackList(reqJson.getJSONArray(KEY_DATA));
}else if(action.equalsIgnoreCase("updateClicStatus")){
// 放款,签订合同,等待放款 更新clic状态
respJson = updateClicStatus(reqJson.getJSONObject(KEY_DATA));
}
}catch (Exception e) { //这里的异常可以处理的更细致一些
respJson = getErrorJson("错误!" + e.getMessage());
}
outputResultJson(respJson);
return null;
}
/**
这里是针对jsonp跨域进行的处理,如果对方传了跨域所需的参数CALLBACK过来,并且有值的话,
使用jsonp的形式给对方返回值,一般适用于对方采用ajax方法调用我们的接口
*/
private void outputResultJson(JSONObject resultJson) throws IOException{
this.getHttpServletResponse().setCharacterEncoding("UTF-8");
if(StringUtils.trimToEmpty(jsonp).length() > 0)
this.getHttpServletResponse().getWriter().write(jsonp+"("+resultJson.toString()+")");
else
this.getHttpServletResponse().getWriter().write(resultJson.toString());
}
private JSONObject updateClicStatus(JSONObject reqJsonData) {
String bsTrasnportId = reqJsonData.getString("bsApplyId");
String status = reqJsonData.getString("status");
logger.info("进件号:"+bsTrasnportId+"状态码:"+status);
Environment.getInstance().getService(TransportService.class).updateClicStatus(Long.parseLong(bsTrasnportId), status);
return RESP_SUCCESS_JSON;
}
使用过程中,大量的接口使用在ajax调用中,这时只能采用jsonp进行跨域.
而又有很多是直接在service中调用,这时候,就只能采用模拟提交表单方式了:
/**
* 获得信审1.0接口地址连接
* @return
*/
private static HttpURLConnection getClic1InterfaceConn() throws Exception{
URL u = new URL(Property.getConstants("CHARGE_DETAIL"));
HttpURLConnection conn = (HttpURLConnection)u.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setUseCaches(false);
return conn;
}
public static void synLoanData(){
List<Map> mcsMap = new ArrayList<Map>();
for(MortgagorContact mc : mcs){
//把对象转换成key,value形式的map
mcsMap.add(BeanUtils.describe(mc));
// 组织json
JSONObject data = new JSONObject();
data.put("bsApplyId", String.valueOf(trans.getBsApplyId()));
data.put("decision", BeanUtils.describe(bd)); // 决策信息
data.put("contact", mcsMap); // 取联系人
data.put("status", StringUtils.trimToEmpty(trans.getProcessNode())); // 进件状态
}
// 提交 ,获得其他系统的接口链接
HttpURLConnection conn = getClic1InterfaceConn();
try{
log.info("同步数据JSON:" + data.toString());
OutputStream os = conn.getOutputStream();
//往接口中提交参数
IOUtils.write("act=borrow", os);
IOUtils.write("&client=" + URLEncoder.encode(data.toString(), "utf-8"), os);
os.flush();
os.close();
String response = IOUtils.toString(conn.getInputStream());
log.info("同步数据给信审1.0,[Response:" + response + "]");
}finally{
conn.disconnect();
}
}
如果采用大量的不同的url去做处理,会造成大量的配置文件,造成管理上的混乱,所以采用一个url,根据参数的不同去调用不同的处理方式去解决.
//根据不同的actionName 调用不同的处理方法
根据参数 action的值,去判断调用哪个service方法.
这样就相当通用了.
:)
分享到:
相关推荐
GDI+的出现使这一现象大为改观,它是微软的.Net Framework的一个重要组成部分,大大增强windows的图形图像开发接口,同时它也改变了传统的GDI编程模式,使开发工作大幅度简化.首先从理论角度介绍GDI+的种种优越特性...
农村教育要改观.docx
网络应用开发曾经被许多开发人员视为畏途,微软.NET技术平台的推出,使这一情况大为改观。.. 本书通过一系列实战项目,演示了如何使用.NET实现各种网络通信应用,包括套接字编程、串行通信、集成指纹阅读器、红外线...
Linux生态环境日益改观.pdf
28个让关键词排名明显改观的SEO技巧 28个让关键词排名明显改观的SEO技巧
对选项稍有点改观... 2007-6-29 双击在默认的浏览器中打开,而不一定是internet explorer!(windows xp sp2,默认The World浏览器中测试通过,其它系统其它默认浏览器请帮忙测试一下 2007-7-2 小失误更新 2007-7-...
移动搜索进步改观 竞价广告更骨感.docx
植物对空气环境的改观影响ppt模板.ppt
Linux竞争走向综合化,生态环境日益改观.pdf
天然空气净化器,植物对空气环境的净化,了解植物,让环境变得更好,植物对空气环境的改观影响ppt模板。
建筑装饰行业研究周报:建筑板块预期较差、未来或将改观
建筑装饰行业研究周报:建筑板块预期较差、未来或将改观.pdf
机械行业周报:龙头中报业绩表现亮眼,工程机械销量数据有望出现改观.pdf
钢铁行业:需求若无改观,则钢价仍有下行压力-0805-中信建投-28页.pdf
环保及公用事业周报:2月社融规模略低于预期,预计3月有所改观,环保板块估值修复可期.pdf
OMCS使得这一状况大大改观,虽然,OMCS底层也调用了非托管的动态库,但是,这对OMCS的使用者是完全透明的,我们可以像使用任何一个纯的.NET动态库一样来使用OMCS。基于OMCS,我们可以快速地开发类似视频会议系统、...
但在VB.NET中,这种状况已经大为改观。现在,我们利用VB.NET处理多线程和利用JAVA处理多线程一样简单了。下面我们就举个例子,来看看VB.NET的多线程吧! 对于初次接触多线程的人,很适合的入门教程。
由于只能在IE中使用,所以大多数开发人员都没有用XMLHttpRequest,直到最近,Mozilla 1.0和Safari 1.2把它采用为事实上的标准,情况才有改观。需要重点说明的是,XMLHttpRequest并不是一个W3C标准,不过许多功能已经...