前言
WebService的两种方式为SOAP和REST。SOAP是一种具体的通讯协议,REST是一种规范。
SOAP
SOAP(Simple Object Access Protocol)简单对象访问协议,是基于HTTP的一种异构系统通信的协议,说白了就是XML格式的文档传输(WSDL)。
WSDL (Web Service Description Language) 也遵循XML格式,用来描述哪个服务器提供什么服务,怎样找到它,以及该服务使用怎样的接口规范。
WebService开发框架也有很多,比较热门的就cxf, axis, axis2等。
REST
REST (Representational State Transfer)表述性状态传递,REST只是一种架构风格,而不是协议或标准。
WebService接口开发
开发环境配置
配置IDE启动参数,服务端增加:
-Duap.hotwebs=uapws
如有其他则用逗号隔开。
如果环境是NC65,服务端增加:
-Dorg.owasp.esapi.resources=${FIELD_NC_HOME}/ierp/bin/esapi
不然可能会报错Failed to load ESAPI.properties as a classloader resource
如图

注意:项目需要初次启动后才会出现上图的UAP应用配置
编写webservice代码
在public包下创建接口

在private下创建接口实现类

在META-INF文件夹下建立一个空的upm文件

并在upm中添加如下内容
module name=“模块名”
<?xml version='1.0' encoding='UTF-8'?>
<module name="tsdp">
<public>
</public>
<private>
</private>
</module>
WS Tools发布
在接口文件上点击右键,选择“WS Tools”-> “Public Web Service”,如图:

选择事先创建好的upm文件

填写“组件名称”(其他信息不需填写),点击“查找”按钮选择相应的接口实现类,下一步

不需要修改,直接点下一步。

取消勾选,点击完成

检查是否成功,upm文件会自动追加内容:

并生成wsdl文件

最后启动服务,使用soap工具测试,地址为ip:prot/uapws/service/upm文件中的compoment name,比如此示例的访问地址为127.0.0.1:8888/uapws/service/helloworld
REST方式接口开发
开发环境配置
与webservice配置一致
配置IDE启动参数,服务端增加:
-Duap.hotwebs=uapws
如有其他则用逗号隔开。
如果环境是NC65,服务端增加:
-Dorg.owasp.esapi.resources=${FIELD_NC_HOME}/ierp/bin/esapi
不然会报错Failed to load ESAPI.properties as a classloader resource
如图


编写rest服务代码
在public下建包与java类,继承
AbstractUAPRestResource类

重写
getModule()方法,return后跟nc项目模块名,并使用@Path("XXXX")在类上添加一级路径

编写接收方法,对数据进行业务处理,并在方法上标明注解:
注意:rest接口所调用代码如果在private下,需要写upm文件
@POST:http请求方式
@Path("xxxx"):二级路径
@Produces("application/json"):指定方法返回的消息格式

代码示例一
将请求数据转为
Object的示例
package nc.itf.rest.test;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import nc.vo.scmpub.api.rest.utils.RestUtils;
import com.alibaba.fastjson.JSONObject;
import uap.ws.rest.resource.AbstractUAPRestResource;
@Path("wlxd")//一级路径
public class restTest extends AbstractUAPRestResource{
@Override
public String getModule() {
//当前项目模块名
return "pu";
}
@POST //请求方式
@Path("test")//二级路径
@Produces("application/json")//返回消息格式
public org.json.JSONString test(Object info){
//处理接收到的电文
JSONObject jo = new JSONObject();
jo.parse(info.toString());
Map<String,Object> mapRet = new HashMap<String,Object>();
mapRet.put("status","ok");
mapRet.put("msg","操作成功");
JSONObject msg = new JSONObject(mapRet);
return RestUtils.toJSONString(msg.toString());
}
}
代码示例二
自动将请求数据转为
JSONObject的示例
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import nc.bs.framework.common.NCLocator;
import nc.bs.framework.server.ISecurityTokenCallback;
import nc.vo.scmpub.api.rest.utils.RestUtils;
import com.alibaba.fastjson.JSONObject;
import uap.ws.rest.resource.AbstractUAPRestResource;
@Path("receiveOA")
public class LeavergstRestForOA extends AbstractUAPRestResource{
@Override
public String getModule() {
return "hrta";
}
@POST
@Path("leavergst")
@Produces("application/json") //请求头Content-Type需要设置为application/json;charset=utf-8
public org.json.JSONString receiveLeavergst(JSONObject info){
LeavergstForOA leavergst = NCLocator.getInstance().lookup(LeavergstForOA.class);
//设置登录信息,避开权限,解决:user session expired,please re login!(0)--> token is null 的问题
NCLocator.getInstance().lookup(ISecurityTokenCallback.class).token("NCSystem".getBytes(), "pfxx".getBytes());
return RestUtils.toJSONString(leavergst.receiveOA(info));
}
}
编写rest文件
编写
rest文件,并放到项目的META-INF文件夹中:
module中的name值为模块名,resource中classname为java代码全路径,其他位置不用修改
<?xml version="1.0" encoding='gb2312'?>
<module name="pu">
<rest>
<resource classname="nc.itf.rest.test.restTest" exinfo=""/>
</rest>
</module>

启动项目并验证
项目启动完成后,在
ip:port/uapws/restmanage查看是否有自己发布的类

使用
ip:port/uapws/rest/一级路径/二级路径,在postman中测试

7698

被折叠的 条评论
为什么被折叠?



