soap
soap 插件将 JSON 请求转换为 Web 服务描述语言(WSDL)文档中定义的 SOAP 操作。它还会在向客户端返回响应前,将 SOAP 响应转换为 JSON。
插件将 WSDL 解析和协议转换委托给 soap-proxy,每个网关实例都必须能够访问该服务。
示例
以下流程将启动 SOAP Proxy、配置网关访问端点,并通过 API7 网关调用公共 SOAP 操作。
配置 SOAP Proxy
请选择与网关部署方式相匹配的配置。
- Docker
- Kubernetes (Helm)
将 GATEWAY_CONTAINER 设置为正在运行的 API7 网关容器。创建专用网络,并将网关连接到该网络:
export GATEWAY_CONTAINER=replace-with-gateway-container-name
docker network create gateway-soap-net
docker network connect gateway-soap-net "$GATEWAY_CONTAINER"
使用当前 API7 网关 Chart 所用的镜像,在共享网络上启动 SOAP Proxy:
docker run -d \
--name soap-proxy \
--network gateway-soap-net \
api7/soap-proxy:1.0.0
将 SOAP Proxy 端点添加到网关部署使用的持久化 config.yaml:
config.yaml
plugin_attr:
soap:
endpoint: http://soap-proxy:5000
timeout: 3000
更新配置源后重新加载网关:
docker exec "$GATEWAY_CONTAINER" apisix reload
将 SOAP Proxy 边车和插件属性添加到网关 Release 使用的完整、受版本控制的 values 文件:
values.yaml
soapProxy:
enabled: true
image:
repository: api7/soap-proxy
tag: 1.0.0
pluginAttrs:
soap:
endpoint: http://127.0.0.1:5000
timeout: 3000
设置 Release 信息,包括部署当前使用的 Chart 版本:
export GATEWAY_RELEASE=replace-with-gateway-release-name
export GATEWAY_NAMESPACE=replace-with-gateway-namespace
export GATEWAY_CHART_VERSION=replace-with-installed-chart-version
应用完整的 values 文件,不更改 Chart 版本:
helm upgrade "$GATEWAY_RELEASE" api7/gateway \
--namespace "$GATEWAY_NAMESPACE" \
--version "$GATEWAY_CHART_VERSION" \
-f values.yaml
边车与网关 Pod 共享网络命名空间,因此网关可通过 127.0.0.1:5000 访问边车。
调用 SOAP 操作
创建一条路由,将 POST /SayHello 映射到 WSDL 文档中的 SayHello 操作:
- Admin API
- ADC
- Ingress Controller
curl "http://127.0.0.1:9180/apisix/admin/routes/soap-hello" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"uri": "/SayHello",
"methods": ["POST"],
"plugins": {
"soap": {
"wsdl_url": "https://apps.learnwebservices.com/services/hello?wsdl"
}
}
}'
adc.yaml
services:
- name: soap-service
labels:
docs-example: soap
routes:
- name: soap-hello
uris:
- /SayHello
methods:
- POST
plugins:
soap:
wsdl_url: "https://apps.learnwebservices.com/services/hello?wsdl"
预览此示例所管理资源 的变更,并确认差异中没有意外更新或删除:
adc diff -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=soap
同步已审查的服务配置:
adc sync -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=soap
- Gateway API
- APISIX CRD
soap-ic.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
namespace: aic
name: soap-hello
spec:
parentRefs:
- name: apisix
rules:
- matches:
- path:
type: Exact
value: /SayHello
method: POST
filters:
- type: ExtensionRef
extensionRef:
group: apisix.apache.org
kind: PluginConfig
name: soap-plugin-config
---
apiVersion: apisix.apache.org/v1alpha1
kind: PluginConfig
metadata:
namespace: aic
name: soap-plugin-config
spec:
plugins:
- name: soap
config:
wsdl_url: "https://apps.learnwebservices.com/services/hello?wsdl"
soap-ic.yaml
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
namespace: aic
name: soap-hello
spec:
ingressClassName: apisix
http:
- name: soap-hello
match:
paths:
- /SayHello
methods:
- POST
plugins:
- name: soap
enable: true
config:
wsdl_url: "https://apps.learnwebservices.com/services/hello?wsdl"
应用配置:
kubectl apply -f soap-ic.yaml
请求路径标识 WSDL 操作,wsdl_url 标识服务契约和上游 SOAP 端点。
向路由发送 JSON 请求:
curl -i "http://127.0.0.1:9080/SayHello" \
-H "Content-Type: application/json" \
-d '{"Name": "John Doe"}'
API7 网关应返回 HTTP/1.1 200 OK 和以下响应体:
"Hello John Doe!"