【问题标题】:API manager. Exception when URLis without version numberAPI 管理器。 URL 没有版本号时的异常
【发布时间】:2016-05-26 22:33:20
【问题描述】:

我正在使用 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 一起使用。

【问题讨论】:

  • 这个异常堆栈跟踪看起来不像默认端点的问题。你能检查一下你的后端服务连接吗?另外,在此日志之前添加两/三行,以便我们确定此错误的根本原因。
  • 我很抱歉。当然在异常之前有消息:在给定请求的 API 中没有找到匹配的资源。但是为什么我会收到这样的消息。请求版本:
  • server:port/name1/name2/1.0/parameter 并且没有版本:server:port/name1/name2/parameter。我必须在上下文 {version} uri 变量中插入吗?
  • 异常前还有一条消息:无法发布事件。空
  • 如果您将 API 勾选为默认版本并发布,则无需提供版本。这在 APIM 1.10 版本中进行了测试和验证。如果您已编辑 API 并将其设为默认值,您是否重新发布了 API

标签: wso2 wso2-am


【解决方案1】:

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

对于现有 API

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

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

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

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

对于新 API

您可以更改 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">

【讨论】:

    【解决方案2】:

    我已经测试了您的用例,但对我来说,它运行良好。在您选中 Make this the Default Version 复选框后,您能否再次检查该 API 是否已正确保存和发布。 您可以通过在carbon控制台中列出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"}
    

    【讨论】:

    • 感谢您的回答。我会再测试一次。
    【解决方案3】:

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

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

    也许有一些解决方法?

    还有一些额外的小问题。如果我不想通过在 GUI 中按下按钮添加参数来添加“路径”参数,我无法做到,因为选择列表中没有选项“路径”,只有查询、标题、formData。

    【讨论】:

      猜你喜欢
      • 2018-12-17
      • 2021-09-15
      • 2013-04-20
      • 2020-02-17
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 2020-11-25
      相关资源
      最近更新 更多