web开发中远程接口的改观用法

本文详细介绍了在遇到远程接口调用连接不上问题时,如何通过使用jsonp跨域方式进行接口调用,并在服务内部根据不同actionName调用不同的处理方法。同时,对于不能使用jsonp的接口调用,则采用模拟提交表单的方式进行处理。文章还提到了大量接口在ajax调用中的应用,以及如何在service中调用接口的实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工作中,使用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方法.

这样就相当通用了.

:)
### 解决 nbtscan 命令无法使用的方法 当遇到 `nbtscan` 命令无法正常使用的情况时,可能的原因包括未安装该工具、环境配置不正确或者权限不足等问题。 #### 检查是否已安装 nbtscan 工具 如果系统中尚未安装此软件包,则需要先通过相应的包管理器来获取并安装它。对于基于 Debian 的 Linux 发行版而言,可以利用 apt-get 安装命令完成这项工作: ```bash sudo apt-get update && sudo apt-get install nbtscan ``` 而对于 Red Hat 或 CentOS 用户来说,则应该采用 yum 来实现同样的目的: ```bash sudo yum install epel-release sudo yum install nbtscan ``` 确认已经成功安装之后再尝试运行 `nbtscan` 命令看问题是否存在改善[^1]。 #### 验证 PATH 环境变量设置情况 有时即使程序确实存在于本地计算机上也可能因为 $PATH 变量里缺少指向其位置的信息而导致找不到命令的现象发生。此时可以通过 which 或者 whereis 这样的辅助指令帮助定位实际存在的可执行文件的位置,并据此调整个人用户的 shell profile 文件中的路径声明部分以确保全局可用性。 例如: ```bash which nbtscan whereis nbtscan ``` 一旦发现路径缺失则可以在 ~/.bashrc (针对单个用户) 或者 /etc/profile (影响所有登录账户) 中追加相应目录到现有定义后面去: ```bash export PATH=$PATH:/new/path/to/nbtscan source ~/.bashrc # 刷新当前终端会话使之生效 ``` #### 授予足够的访问权限给使用者账号 考虑到某些安全策略可能会限制普通成员调用特定应用程序的权利,在这种情况下应当赋予他们必要的许可级别以便能够顺利启动目标进程而不受阻碍。这通常涉及到更改所属关系以及设定合适的读写属性等操作,具体做法如下所示: ```bash sudo chown root:users /usr/bin/nbtscan # 修改拥有权至root组下的users群组 sudo chmod u+s /usr/bin/nbtscan # 设置SUID位使任何执行它的人都具有发起者的身份 ``` 以上措施有助于克服由于权限不够而引起的各类异常状况的发生概率。 #### 使用绝对路径代替相对路径 假如经过上述排查仍然未能解决问题的话,不妨试着直接指定完整的二进制映像所在地址来进行测试看看是否会有所改观。比如假设知道确切放置于 `/opt/tools/` 下面就可以这样去做: ```bash /opt/tools/nbtscan -h ``` 这样做不仅绕过了潜在的搜索机制缺陷而且还能有效减少中间环节带来的不确定性因素干扰。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值