基于AWS PaaS的API架构,应用开发者可以使用Java语言封装和发布自己的SOAP API。
获得本地开发环境,请移步这里。
SOAP服务类是一个普通pojo类,该类可以使用JAX-WS规范的JDK注解。还可以使用HTTP API的注解,这样该Java类将同时允许以HTTP和SOAP方式访问。
注解 | 说明 |
---|---|
@WebService | JAX-WS注解,详细可参考这里 |
示例
@WebService(serviceName = "DemoApi")
public class SayHello {
...
}
注解 | 说明 |
---|---|
@WebParam | JAX-WS注解,详细可参考这里 |
示例
// 返回简单String
public StringResponse say(@WebParam(name = "str1") String str1) {
StringResponse r = new StringResponse();
r.setData(str1);
System.out.println(str1);
return r;
}
同HTTP API,请点击这里。
将编写的程序编译成jar,存放到您自己的应用lib目录下(假设应用名称是com.abc.apps.do,那么路径应该在%AWS-HOME%/apps/install/com.abc.apps.do/lib),如果开发者引用了三方jar资源,也一同存放到该目录下。
正常情况,这些jar资源将被动态加载到AWS PaaS容器,自动完成发布。当处于开发调试环境时,若首次未自动发布,可重启本地的AWS PaaS服务。
通过AWS CC的服务注册
组件注册,为您的App注册SOAP服务,并提供一个全局的服务ID(如demoApi)。
- 为了避免您开发的服务Id与其他服务冲突,建议使用更具体的差异命名
- 在
服务注册
中可以设置服务策略,该安全策略来自AWS CC的服务策略
组件提供的服务,如果未设置则访问服务不需要安全认证
注册成功后可以通过服务ID后的URL查看服务的WSDL信息,也可以在服务接口文档
的Web Services
列表中浏览到该服务。
本地开发者试着在浏览器输入
http://localhost:8088/portal/r/s?id=demoApi&wsdl=true
使用SoapUI测试发布的SOAP服务
测试say方法,请求结构
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:api="http://api.local.api.poc.apps.actionsoft.com/">
<soapenv:Header/>
<soapenv:Body>
<api:say>
<!--Optional:-->
<str1>2017</str1>
</api:say>
</soapenv:Body>
</soapenv:Envelope>
测试say方法,返回结果
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:sayResponse xmlns:ns2="http://api.local.api.poc.apps.actionsoft.com/">
<return>
<data>2017</data>
</return>
</ns2:sayResponse>
</soap:Body>
</soap:Envelope>
测试calc方法,请求结构
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:api="http://api.local.api.poc.apps.actionsoft.com/">
<soapenv:Header/>
<soapenv:Body>
<api:calc>
<!--Optional:-->
<num1>100</num1>
<!--Optional:-->
<num2>20</num2>
</api:calc>
</soapenv:Body>
</soapenv:Envelope>
测试say方法,返回结果
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:calcResponse xmlns:ns2="http://api.local.api.poc.apps.actionsoft.com/">
<return>
<num1>100</num1>
<num2>20</num2>
<num3>120</num3>
</return>
</ns2:calcResponse>
</soap:Body>
</soap:Envelope>
源码1:SayHello.java
package com.actionsoft.apps.poc.api.local.api;
import javax.jws.WebParam;
import javax.jws.WebService;
import com.actionsoft.bpms.server.bind.annotation.Controller;
import com.actionsoft.bpms.server.bind.annotation.HandlerType;
import com.actionsoft.bpms.server.bind.annotation.Mapping;
import com.actionsoft.bpms.server.bind.annotation.Param;
import com.actionsoft.sdk.service.response.StringResponse;
@Controller(type = HandlerType.OPENAPI, apiName = "Demo API", desc = "API扩展开发演示")
@WebService(serviceName = "DemoApi")
public class SayHello {
// 返回简单String
@Mapping(value = "demo.say")
public StringResponse say(@Param(value = "str1", desc = "字符串1", required = true) @WebParam(name = "str1") String str1) {
StringResponse r = new StringResponse();
r.setData(str1);
System.out.println(str1);
return r;
}
// 返回自定义的对象
@Mapping(value = "demo.calc")
public CalcDataResponse calc(@Param(value = "num1", desc = "数字1", required = true) @WebParam(name = "num1") Integer num1, @Param(value = "num2", desc = "数字2", required = true) @WebParam(name = "num2") Integer num2) {
CalcDataResponse r = new CalcDataResponse(num1, num2);
return r;
}
}
源码2:CalcDataResponse.java
package com.actionsoft.apps.poc.api.local.api;
import javax.xml.bind.annotation.XmlRootElement;
import com.actionsoft.bpms.api.common.ApiResponse;
@XmlRootElement
public class CalcDataResponse extends ApiResponse {
private int num1;
private int num2;
private int num3;
public CalcDataResponse() {
}
public CalcDataResponse(int num1, int num2) {
super();
this.num1 = num1;
this.num2 = num2;
// 计算相加
num3 = num1 + num2;
}
public int getNum1() {
return num1;
}
public void setNum1(int num1) {
this.num1 = num1;
}
public int getNum2() {
return num2;
}
public void setNum2(int num2) {
this.num2 = num2;
}
public int getNum3() {
return num3;
}
public void setNum3(int num3) {
this.num3 = num3;
}
}