访问 REST 服务时出现访问冲突
Access Violation when accessing REST service
我已经建立了一个第三方 Rest/Json 网络 API 的接口,对于有效的测试用例一切都很好,但是当我从 API 请求一些无效的东西时,说一个不存在的工作,API return 是一个响应,其中正文 = 'null' 并且内容类型为 "application/json; charset=utf-8"。我不确定这是否是 Web API 的标准做法,但是当我在 IHttpClient 上调用 Execute 时,我最终遇到访问冲突并且客户端退出。
Protrace 如下
Exception code: C0000005 ACCESS_VIOLATION
Fault address: 00007FFC6733DAAD 01:000000000077CAAD C:\Apps\Progress7\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 到 return 'Null' 正常吗?
其次,这显然是 OpenEdge.Net.HTTP.Lib 中未处理的异常,不应导致客户端崩溃。有什么解决方法吗?我试过将 AcceptJson() 更改为 AcceptAll 和 AcceptHTML,但是过程是一样的,在 JsonEntityWriter 中崩溃。
谢谢
不,如果您向无效路由发出请求,通常 RESTful API 会 return 404。我能想到的唯一例外是,如果您尝试访问将参数作为 URI 的一部分的路由。
我已经建立了一个第三方 Rest/Json 网络 API 的接口,对于有效的测试用例一切都很好,但是当我从 API 请求一些无效的东西时,说一个不存在的工作,API return 是一个响应,其中正文 = 'null' 并且内容类型为 "application/json; charset=utf-8"。我不确定这是否是 Web API 的标准做法,但是当我在 IHttpClient 上调用 Execute 时,我最终遇到访问冲突并且客户端退出。
Protrace 如下
Exception code: C0000005 ACCESS_VIOLATION
Fault address: 00007FFC6733DAAD 01:000000000077CAAD C:\Apps\Progress7\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 到 return 'Null' 正常吗?
其次,这显然是 OpenEdge.Net.HTTP.Lib 中未处理的异常,不应导致客户端崩溃。有什么解决方法吗?我试过将 AcceptJson() 更改为 AcceptAll 和 AcceptHTML,但是过程是一样的,在 JsonEntityWriter 中崩溃。
谢谢
不,如果您向无效路由发出请求,通常 RESTful API 会 return 404。我能想到的唯一例外是,如果您尝试访问将参数作为 URI 的一部分的路由。