【问题标题】:Access Violation when accessing REST service访问 REST 服务时访问冲突
【发布时间】:2018-07-08 19:30:24
【问题描述】:

我已经为第三方 Rest/Json Web API 构建了一个接口,在有效的测试用例中一切都很好,但是当我从 API 请求一些无效的东西时,比如一个不存在的作业,API 会返回一个响应,其中 body = 'null' 并且内容类型为“application/json; charset=utf-8”。我不确定这是否是 Web API 的标准做法,但是当我在 IHttpClient 上调用 Execute 时,我最终会遇到访问冲突并且客户端退出。

Protrace 是一个跟随

    Exception code: C0000005 ACCESS_VIOLATION
    Fault address:  00007FFC6733DAAD 01:000000000077CAAD C:\Apps\Progress\117\bin\prow.dll

        ** ABL Stack Trace **

   --> Write OpenEdge.Net.HTTP.Filter.Payload.JsonEntityWriter at line 463  (OpenEdge/Net/HTTP/Filter/Payload/JsonEntityWriter.r)
        ExtractEntity OpenEdge.Net.HTTP.Lib.ABLSockets.ABLSocketLibrary at line 360  (OpenEdge/Net/HTTP/Lib/ABLSockets/ABLSocketLibrary.r)
        Execute OpenEdge.Net.HTTP.Lib.ABLSockets.ABLSocketLibrary at line 312  (OpenEdge/Net/HTTP/Lib/ABLSockets/ABLSocketLibrary.r)
        Execute OpenEdge.Net.HTTP.HttpClient at line 154  (OpenEdge/Net/HTTP/HttpClient.r)
        TryRest Tempo.TempoApi at line 1264  (D:\_Dev\OnTap-Trunk\rcode\Tempo\TempoApi.r)
        ExecuteRest Tempo.TempoApi at line 234  (D:\_Dev\OnTap-Trunk\rcode\Tempo\TempoApi.r)

TryRest 是:

    METHOD PRIVATE INTEGER TryRest(
        INPUT  oUri AS URI,  
        INPUT  cType AS CHARACTER,
        INPUT  cContentType AS CHARACTER,
        INPUT  oContent AS Object,
        OUTPUT oResponse AS IHttpResponse ):

        DEFINE VARIABLE result AS INTEGER NO-UNDO.

        DEFINE VARIABLE oRequest AS IHttpRequest NO-UNDO.

        CASE cType:

            WHEN "GET" THEN
                oRequest = RequestBuilder:GET(oURI)
                                         :AddHeader("Authorization", "Bearer " + STRING(cAccessToken))
                                         :AcceptJson()
                                         :REQUEST.
        END CASE.    

        oResponse = ResponseBuilder:Build():Response.
        oClient:EXECUTE(oRequest,oResponse).

        RETURN oResponse:StatusCode.

        CATCH e AS Progress.Lang.Error:
            UNDO, THROW e.
        END CATCH.

    END METHOD.

我使用的是最新的 OpenEdge 客户端,11.7.2 Windows x64。

我的问题是,Web API 针对无效请求返回“Null”是否正常?

其次,这显然是 OpenEdge.Net.HTTP.Lib 中未处理的异常,它不应该导致客户端崩溃。有什么解决办法吗?我尝试将 AcceptJson() 更改为 AcceptAll 和 AcceptHTML,但 protrace 是相同的,在 JsonEntityWriter 中崩溃。

谢谢

【问题讨论】:

    标签: rest openedge progress-4gl


    【解决方案1】:

    不,如果您向无效路由发出请求,通常 RESTful API 会返回 404。我能想到的唯一例外是,如果您尝试访问将参数作为 URI 一部分的路由。

    【讨论】:

    • 即便如此,根据我的经验,要么你会得到某种 JSON 或任何格式的回复,要么你会得到 40 倍的错误
    • 谢谢,路由是有效的,但在这种情况下,我使用了无效的作业 ID,它是 URI 的一部分 - https://{{url}}/{{api}} /api/v1/jobs/178 - 178 不存在。我希望得到 400 响应,但这个 API 给出了 200 的空正文。
    • 在这种情况下,API 听起来好像缺少一些修饰。大多数 API 会告诉您未找到任何结果、发送不同的状态代码或类似的其他内容。这取决于负责 API 的开发人员。
    • 谢谢,我就是这么想的,但我没有很多使用 REST 的经验。在我告诉第三方修复他们的界面之前,我需要第二个意见:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 2013-02-26
    • 2015-04-23
    • 2018-04-16
    • 1970-01-01
    相关资源
    最近更新 更多