NC65实现Restful接口开发及调试

  1. 在nchome中的modules里对应的业务模块的META-INF中添加 occ.rest文件,开发项目中也是在项目对应的META-INF下,如图:
    在这里插入图片描述

在这里插入图片描述
在模块的META-INF文件夹下,增加occ.rest扩展名的接口文件,内容为xml格式,参考脚本如下:

<?xml version="1.0" encoding='gb2312'?>
<module>
	<rest>
		<resource classname="nc.pubitf.api.rest.occ.SaleTargetRestResource"  exinfo=""/>
	</rest>
</module>
  1. 在public端(有些人也算放在private端,看个人吧)对应的目录结构下,添加相关的接口处理服务类SaleTargetRestResource,内容如下:
package nc.pubitf.api.rest.occ;

import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import mobile.bc.api.base.PublicRestResource;
import nc.bs.framework.common.NCLocator;
import nc.itf.uap.IUAPQueryBS;
import nc.jdbc.framework.SQLParameter;
import nc.jdbc.framework.processor.BeanListProcessor;
import nc.pubitf.api.rest.base.ErrInfoEnum;
import nc.pubitf.api.rest.base.Response;
import nc.vo.pub.BusinessException;

@Path("/occ/query")
public class SaleTargetRestResource extends PublicRestResource{
	
	private static IUAPQueryBS queryBS = NCLocator.getInstance().lookup(IUAPQueryBS.class);
	
	@POST
	@Path("/sale-target-info")
	@Consumes(MediaType.APPLICATION_JSON)
	@Produces(MediaType.APPLICATION_JSON)
	public String querySaleTarget(QuerySaleTargetInfoRequestParam queryParam) {
		Response<List<SaleTargetInfoVO>> response = new Response<>();
		try {
			queryParam.checkParamIsNull();
		} catch (Exception e) {
			return response.err(ErrInfoEnum.INVLIAD_PARAMS.getCode(), e.getMessage()).toString();
		}
		
		List<SaleTargetInfoVO> targetInfoVO = getSaleTargetInfo(queryParam);
		response.ok(targetInfoVO);
		
		return response.toString();
	}

	@SuppressWarnings("unchecked")
	private List<SaleTargetInfoVO> getSaleTargetInfo(QuerySaleTargetInfoRequestParam queryParam) {
		String sql = "select distinct sr_target.blowsetflag,\r\n" + 
				"                sr_target.dbegindate,\r\n" + 
				"                sr_target.denddate,\r\n" + 
				"                sr_target.fcyclesetflag,\r\n" + 
				"                sr_target.fheadshowflag,\r\n" + 
				"                sr_target.fmaintainflag,\r\n" + 
				"                sr_target.fmarsetflag,\r\n" + 
				"                sr_target.fyearflag,\r\n" + 
				"                sr_target.pk_group,\r\n" + 
				"                sr_target.pk_org,\r\n" + 
				"                sr_target.pk_target,\r\n" + 
				"                sr_target.vcode,\r\n" + 
				"                sr_target.vname,\r\n" + 
				"                sr_target.vnote\r\n" + 
				"  from sr_target sr_target\r\n" + 
				" where sr_target.pk_org = '?'\r\n" + 
				"   and nvl(sr_target.dr, 0) = 0\r\n" + 
				
				" order by sr_target.pk_target";
		
		SQLParameter sqlParam = new SQLParameter();
		sqlParam.addParam(queryParam.getPkOrg());
		
		List<SaleTargetInfoVO> result = new ArrayList<SaleTargetInfoVO>();
		try {
			result = (List<SaleTargetInfoVO>) queryBS.executeQuery(sql, sqlParam, new BeanListProcessor(SaleTargetInfoVO.class));
		} catch (BusinessException e) {
			e.printStackTrace();
		}
		
		return result;
	}
	
}

package nc.pubitf.api.rest.occ;

public class SaleTargetInfoVO {
	/**
	 * 统一设定下级销售组织指标值
	 */
	private String blowsetflag;
	/**
	 * 开始日期
	 */
	private String dbegindate;

	/**
	 * 结束日期
	 */
	private String denddate;

	/**
	 * 指标设定周期
	 */
	private String fcyclesetflag;

	/**
	 * 指标维护表头设置
	 */
	private String fheadshowflag;

	/**
	 * 指标维护方式
	 */
	private String fmaintainflag;

	/**
	 * 物料指标设定方式
	 */
	private String fmarsetflag;

	/**
	 * 年度
	 */
	private String fyearflag;

	/**
	 * 集团
	 */
	private String pk_group;

	/**
	 * 销售组织
	 */
	private String pk_org;

	/**
	 * 指标设置主实体
	 */
	private String pk_target;

	/**
	 * 销售指标表编号
	 */
	private String VCODE = "vcode";

	/**
	 * 销售指标表名称
	 */
	private String vname;

	/**
	 * 备注
	 */
	private String vnote;
	
	public String getBlowsetflag() {
		return blowsetflag;
	}

	public void setBlowsetflag(String blowsetflag) {
		this.blowsetflag = blowsetflag;
	}

	public String getDbegindate() {
		return dbegindate;
	}

	public void setDbegindate(String dbegindate) {
		this.dbegindate = dbegindate;
	}

	public String getDenddate() {
		return denddate;
	}

	public void setDenddate(String denddate) {
		this.denddate = denddate;
	}

	public String getFcyclesetflag() {
		return fcyclesetflag;
	}

	public void setFcyclesetflag(String fcyclesetflag) {
		this.fcyclesetflag = fcyclesetflag;
	}

	public String getFheadshowflag() {
		return fheadshowflag;
	}

	public void setFheadshowflag(String fheadshowflag) {
		this.fheadshowflag = fheadshowflag;
	}

	public String getFmaintainflag() {
		return fmaintainflag;
	}

	public void setFmaintainflag(String fmaintainflag) {
		this.fmaintainflag = fmaintainflag;
	}

	public String getFmarsetflag() {
		return fmarsetflag;
	}

	public void setFmarsetflag(String fmarsetflag) {
		this.fmarsetflag = fmarsetflag;
	}

	public String getFyearflag() {
		return fyearflag;
	}

	public void setFyearflag(String fyearflag) {
		this.fyearflag = fyearflag;
	}

	public String getPk_group() {
		return pk_group;
	}

	public void setPk_group(String pk_group) {
		this.pk_group = pk_group;
	}

	public String getPk_org() {
		return pk_org;
	}

	public void setPk_org(String pk_org) {
		this.pk_org = pk_org;
	}

	public String getPk_target() {
		return pk_target;
	}

	public void setPk_target(String pk_target) {
		this.pk_target = pk_target;
	}

	public String getVCODE() {
		return VCODE;
	}

	public void setVCODE(String vCODE) {
		VCODE = vCODE;
	}

	public String getVname() {
		return vname;
	}

	public void setVname(String vname) {
		this.vname = vname;
	}

	public String getVnote() {
		return vnote;
	}

	public void setVnote(String vnote) {
		this.vnote = vnote;
	}

}

package nc.pubitf.api.rest.occ;

import javax.validation.constraints.NotNull;

import nc.pubitf.api.rest.base.BaseRequestParam;

/**
 * 根据组织编码查询销售指标
 * 
 * @author 
 *
 */
public class QuerySaleTargetInfoRequestParam extends BaseRequestParam {
	
	@NotNull(message = "组织PK不能为空")
	private String pkOrg;

	private String orgCode;

	private String customerCodes;

	public String getPkOrg() {
		return pkOrg;
	}

	public void setPkOrg(String pkOrg) {
		this.pkOrg = pkOrg;
	}

	public String getOrgCode() {
		return orgCode;
	}

	public void setOrgCode(String orgCode) {
		this.orgCode = orgCode;
	}

	public String getCustomerCodes() {
		return customerCodes;
	}

	public void setCustomerCodes(String customerCodes) {
		this.customerCodes = customerCodes;
	}

}

  1. 部署和测试

将上面的代码部署到dm模块后,重启中间件,Postman测试时,测试URL设置为:http://ip:port/uapws/rest/occ/query/sale-target-info,其中occ/query/sale-target-info为代码中的类声明中的Path和方法中的Path,uapws/rest/为固定的NC65中的REST服务访问路径。Postman中设置请求方式为“POST”,请求HEAD参数Content-Type为application/json即可。效果如下:
在这里插入图片描述
注意:调试的时候,需要配置自变量,即添加uapws模块(已添加的忽略),不然调试没反应,我看了网上很多资料都没有说这一点,毕竟还是大多数人都是不熟悉这些东西的。配置如图:
在这里插入图片描述

在这里插入图片描述

NC中可以通过/uapws/service查看SOAP协议的接口的部署情况,REST协议的实际也有一个查看REST接口的serverlet,地址为uapws/restmanage,如下图,通过这个地址可以查看已经部署的REST接口清单以及接口所属的模块:
在这里插入图片描述


版权声明:本文为u010741112原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。