API 经理。 URL没有版本号时的异常

API manager. Exception when URLis without version number

我正在使用 WSO2 API 管理器 1.10.0。如果我发布 API 并订阅,然后用版本号调用这个 API,一切都可以。 API 的默认版本已选中。当我向这个 API 发送请求时没有 URL 中的版本我得到异常:

TID: [-1234] [] [2016-05-06 07:23:01,782] ERROR {org.wso2.carbon.apimgt.usage.publisher.APIMgtFaultHandler} -  Cannot publish event. null {org.wso2.carbon.apimgt.usage.publisher.APIMgtFaultHandler}
java.lang.NumberFormatException: null
at java.lang.Long.parseLong(Long.java:552)
at java.lang.Long.parseLong(Long.java:631)
at org.wso2.carbon.apimgt.usage.publisher.APIMgtFaultHandler.mediate(APIMgtFaultHandler.java:76)
at    org.apache.synapse.mediators.ext.ClassMediator.mediate(ClassMediator.java:84)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:81)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:48)
at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:155)

at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:220)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:81)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:48)
at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:155)
at org.apache.synapse.rest.API.process(API.java:389)
at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:97)
at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:65)
at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:295)
at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:83)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:317)
at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:149)
at org.apache.axis2.transport.base.threads.NativeWorkerPool.run(NativeWorkerPool.java:172)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

我们的 API 管理器配置为使用 WSO2 IS 5.1.0 和 WSO2 DAS。

我已经测试了您的用例,但对我来说,它运行良好。您能否在选中 设为默认版本 复选框后再次检查 API 是否正确保存和发布。 您可以通过在 carbon 控制台中列出 APIs(Metadata-> list-> API) 来检查它,然后单击 API 名称。

我只是使用带有一些查询参数的 CalculatorAPI 示例对其进行了测试。我刚刚发布了样本并订阅了 CalculatorAPI。以下是调查结果。

发布后(未选中 将其设为默认版本 复选框)

第一次 API 调用版本

curl -k -X GET --header "Accept: application/json" --header "Authorization: Bearer afbbb795dadf272cec9c44efc78dc81b" "https://192.168.1.4:8243/calc/1.0/add?x=2&y=2"

回应

{"answer": "4.0"}

第二次 API 调用无版本

curl -k -X GET --header "Accept: application/json" --header "Authorization: Bearer afbbb795dadf272cec9c44efc78dc81b" "https://192.168.1.4:8243/calc/add?x=2&y=2"

回应

am:fault xmlns:am="http://wso2.org/apimanager"><am:code>404</am:code><am:type>Status report</am:type><am:message>Not Found</am:message><am:description>The requested resource (/calc/add?x=2&amp;y=2) is not available.</am:description></am:fault>


然后我编辑了 API 并选中了 将其设为默认版本 复选框,然后发布了 API。现在我调用了 API,下面是输出。

第一次 API 调用版本

curl -k -X GET --header "Accept: application/json" --header "Authorization: Bearer afbbb795dadf272cec9c44efc78dc81b" "https://192.168.1.4:8243/calc/1.0/add?x=2&y=2"

回应

{"answer": "4.0"}

第二次 API 调用无版本

curl -k -X GET --header "Accept: application/json" --header "Authorization: Bearer afbbb795dadf272cec9c44efc78dc81b" "https://192.168.1.4:8243/calc/add?x=2&y=2"

回应

{"answer": "4.0"}

我找到了没有版本的端点不起作用的答案或某些原因。如果我在 API 定义中将一些参数放入 URL 模式(例如 /a/{param} 或 /a?param={param},API 描述中的资源(xml 文件)是用属性 url-template=/a/{param} 生成的,在这种情况下,如果没有版本,这样的端点就不能工作。如果我删除 {param } 来自 URL 模式并通过按钮 "Add Parameter" 插入参数 - 没有版本的端点(默认)工作正常。在这种情况下,在 API 描述资源是使用属性 url-mapping 与 url-template 不同(我认为在 ESB 中,资源中有两种类型的 URL)。

因此,当我不想使用没有版本(默认)的端点时,我必须拒绝在 URL 模式中显式使用路径和查询参数。

也许有一些解决方法?

还有一些小问题。如果我想通过在 GUI 中按下“添加参数”按钮来添加 "path" 参数,我做不到,因为 select 列表中没有选项 "path",有查询,header,仅限表单数据。

此问题将在下一个版本中修复,您可以使用以下解决方法来解决此问题。

现有APIs

  • 编辑默认 api 的突触配置文件,该文件位于 /repository/deployment/server/synapse-configs/default/api 文件夹中。

例如: 版本文件名 API - admin--CountryTest_v1.0.0.xml, 默认文件名API - admin--CountryTest.xml

  • 替换资源标签内的uri-template值并保存文件。

    • 当前值 - uri-template="$util.escapeXml($resource.getUriTemplate())"
    • 新值 - uri-template="/*"

对于新的APIs

您可以更改 default_api_template.xml 文件以便为新的 API 应用修复程序。

  • 编辑 /repository/resources/api_templates 文件夹中的 default_api_template.xml 替换新值中的资源标签。

当前值 -

<resource xmlns="http://ws.apache.org/ns/synapse"
    #if($resource.getUriTemplate().contains("{") ||
       ($resource.getUriTemplate().contains("*") && !$resource.getUriTemplate().endsWith("/*")))
        uri-template="$util.escapeXml($resource.getUriTemplate())"
    #else
       url-mapping="$resource.getUriTemplate()"
    #end
        methods="$resource.getMethodsAsString()" faultSequence="fault">

新值 -

<resource methods="POST PATCH GET DELETE HEAD PUT OPTIONS"
         uri-template="/*"
         faultSequence="fault">