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&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">
我正在使用 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&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">