动态替换端点的 PATH 值(WSO2 - API Manager)

Dynamically replace the PATH value of an Endpoint (WSO2 - API Manager)

我在 WSO2 API 管理器 (1.10.0) 中创建了一个 API,其中包含以下信息:

POST:

/regularPath/* 

API URL:

http://<ip-address-1>/t/tenant.com/api/1.0.0/

HTTP 端点:

http://<ip-address-2>:8181/{uri.var.newRestVar}

问题是 HTTP 端点有多个路径,例如:

http://<ip-address-2>:8181/mainService/cityInfo
http://<ip-address-2>:8181/country/cityInfo
http://<ip-address-2>:8181/country/dataKey/amountOfUsers
http://<ip-address-2>:8181/main/city/data/users

我希望生成的 API URL 看起来像这样:

http://<ip-address-1>/t/tenant.com/api/1.0.0/regularPath/mainService/cityInfo
http://<ip-address-1>/t/tenant.com/api/1.0.0/regularPath/country/cityInfo
http://<ip-address-1>/t/tenant.com/api/1.0.0/regularPath/country/dataKey/amountOfUsers
http://<ip-address-1>/t/tenant.com/api/1.0.0/regularPath/main/city/data/users

我最初的方法是使用 REST_URL_PREFIX 变量来捕获 API URL 的 1.0.0 部分之后的路径(例如:regularPath/country/dataKey/amountOfUsers),然后将该值赋给 uri.var.newRestVar 变量。

接下来,是我在 API 管理器中创建的 API 管理器 (Carbon) 的修改后的服务总线配置:

...    
<inSequence>
    <filter regex="PRODUCTION" source="$ctx:AM_KEY_TYPE">
        <then>
            <property expression="get-property('SYSTEM_TIME')" name="api.ut.backendRequestTime"/>

            <log>
                <property expression="$trp:To" name="ToURL"/>
            </log>

            <property expression="$axis2:REST_URL_POSTFIX" name="restURL" scope="default" type="STRING"/>

            <log>
                <property
                    expression="get-property('restURL')" name="logRestURL"/>
            </log>

            <script description="JS" language="js">
                <![CDATA[
                    var unmodifiedRestPostfix = new String(mc.getProperty("restURL"));  
                    print("value = " + unmodifiedRestPostfix);
                    unmodifiedRestPostfix = unmodifiedRestPostfix.replace("/regularPath/", "");      
                    mc.setProperty("uri.var.newRestVar", unmodifiedRestPostfix);
                ]]>
            </script>
            <log>
                 <property expression="get-property('uri.var.newRestVar')" name="URI_VAR_NEWRESTVAR"/>
            </log>                                   
            <send>
                <endpoint name="admin-AT-tenant.com--API-Main_APIproductionEndpoint_0">
                    <http uri-template="http://<ip-address-2>:8181/{uri.var.newRestVar}"/>
                </endpoint>
            </send>
...

但是不行。我检查了日志,但似乎一切正常:

TID: [35] [] [2016-04-11 16:47:01,955] @bank.com [35] [AM] INFO {org.apache.synapse.mediators.builtin.LogMediator} -  To: local://axis2services/api/1.0.0/regularPath/mainService/cityInfo, MessageID: urn:uuid:091613ce-9fd3-4094-8638-5b112
a4214ad, Direction: request, logRestURL = /regularPath/mainService/cityInfo {org.apache.synapse.mediators.builtin.LogMediator}
a4214ad, Direction: request, URI_VAR_NEWRESTVAR = /regularPath/mainService/cityInfo {org.apache.synapse.mediators.builtin.LogMediator}

我应该更改什么配置才能使用我提到的 API 的路径成功访问 HTTP 端点?

你可以在不修改突触配置的情况下做同样的事情。以下是步骤。希望它能成为您的解决方案

创建 api 如下

API context : api/{version}/regularPath

注意:您可以将上下文中的版本定义为AM 1.10中的模板。定义版本后,上面的上下文将获得版本

resources: 
POST   mainService/cityInfo
POST   country/cityInfo
POST   country/dataKey/amountOfUsers
POST   main/city/data/users

HTTP Endpoint
http://<ip-address-2>:8181

之后您就可以调用后端了。无需向突触配置添加自定义修改

 http://<ip-address-2>:8181/country/dataKey/amountOfUsers

http://<ip-address-1>/t/tenant.com/api/1.0.0/regularPath/country/dataKey/amountOfUsers

附加信息

如果出现问题,您可以启用线路日志并检查网关中传入和传出的请求类型。请参阅 http://mytecheye.blogspot.com/2013/09/wso2-esb-all-about-wire-logs.html 了解如何启用 wirelogs 并使用它进行调试。