API经理。 URL没有版本号时的例外情况

时间:2016-05-09 05:29:55

标签: wso2 wso2-am

我正在使用WSO2 API Manager 1.10.0。如果我发布API并订阅然后使用版本号调用此API,则一切正常。检查API的默认版本。当我在URL中发送没有版本的API的请求时,我得到例外:

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$1.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。

3 个答案:

答案 0 :(得分:0)

我测试了你的用例,但对我来说,它运行正常。您可以在选中使其成为默认版本复选框后,仔细检查该API是否已正确保存并发布。 您可以通过在碳纤维控制台中列出API(元数据 - >列表 - > 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"}

答案 1 :(得分:0)

我找到了一个答案或某些原因,为什么没有版本的端点不起作用。如果我在API定义中为URL模式添加一些参数(例如/ a / {param}或/ a?param = {param},则使用属性 url-template生成API描述(xml文件)中的资源 = / a / {param}并且在这种情况下,这样的端点在没有版本的情况下不起作用。如果我从URL模式中删除{param}并通过按钮插入参数&#34;添加参数&#34; - 没有版本的端点(默认)工作正常。在这种情况下,API描述资源是使用属性 url-mapping 而不是使用url-template生成的(就像在ESB中一样,资源中有两种类型的URL,I想)。

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

也许有一些解决方法?

还有一些小问题。如果我想添加&#34;路径&#34;通过按下按钮的参数ADD参数在GUI中我无法做到,因为没有选项&#34;路径&#34;在选择列表中,只有查询,标题,formData。

答案 2 :(得分:0)

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

适用于现有API

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

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

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

    • 当前值 - uri-template =&#34; $ util.escapeXml($ resource.getUriTemplate())&#34;
    • 新值 - uri-template =&#34; / *&#34;

适用于新API

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

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

当前价值 -

unreferencedCollections="true"

新价值 -

<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">