我正在使用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。
答案 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&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的文件名 - admin - CountryTest_v1.0.0.xml, 默认API的文件名 - admin - CountryTest.xml
替换资源标记内的uri-template值并保存文件。
适用于新API
您可以更改default_api_template.xml文件,以便为新API应用此修复程序。
当前价值 -
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">