Oracle ORDS 远程过程调用:负载和调试

Oracle ORDS remote procedure call : payload and debug

我正在尝试开发一些 REST API,我正在使用:Oracle Database 12c 企业版 12.1.0.2.0 版 - 64 位生产版、Oracle ORDS 和 SQL 开发人员 17.3.1.279 .

我已经开发并测试了 GET API 以证明数据库是 REST-Enabled 的。

我尝试开发 POST API 我正在阅读 this article

我的 POST 处理程序是:

declare
    lrow accounts%rowtype := null;    
begin   
    lrow.id := :id;
    lrow.account := :account;

    /*added to inspect the current value*/
    Raise_Application_Error(-20000, '*'||:account||'*');

    lrow.category := :category;
    lrow.address := :address;
    lrow.zipcode := :zipcode;
    lrow.city := :city;
    lrow.county := :county;
    ASADMIN.INSERTACCOUNT(lrow);
    :error := null;
exception
    when others then
        :error := sqlerrm;
end;

对于每个绑定变量,我在处理程序中创建一个相应的 in/out 参数。

我用 POSTMAN 测试 API 通过这个对象:

{
"id" : "18092018"
,"account" : "Buster Keaton"
,"category" : "TEST CATEGORY"
,"address" : "TEST ADDRESS"
,"zipcode" : "12345"
,"city" : "TEST CITY"
,"county" : "TEST COUNTY"
,"error" : null
}

响应是“无法在...中插入 NULL”,然后我添加引发应用程序错误以检查传递的结果为 null 的值是什么。

我想知道调试 REST API 的常见(或最佳)预习以及“监视”绑定变量的方法。

我尝试 运行 附加到 SQL 开发人员内部处理程序的匿名块,以确保它首先在那里工作。那么,在 SQL 开发人员中,您正在执行 restful 服务定义吗?

对于阅读此问题的其他人,当您想'debug'但无权访问 ORDS 服务器日志时: 如果从 ORDS 调用它时得到 500 响应,这对 运行 'debug' 模式下的 ORDS 很有帮助。

您可以启用两个属性,调试和打印到屏幕。 (docs)

这将在您的浏览器中显示来自后端的堆栈转储 - 这不是您在 'prod' 中想要做的事情,但由于您正在调试,我假设您在安全的地方.

打开后,再次拨打电话 -

现在您可以看到导致 500 的 ORA 错误代码 - 您还可能看到 ORDS 如何执行 anon plsql 块 - 也许您没有正确处理输入...

I talk about this here.

对于您的具体情况,在调用 INSERTACCOUNT() 时,您要么输入错误,要么忽略了一个值。

在没有看到 INSERTACCOUNT() 的规范的情况下,我们只能猜测可能会发生什么。

评论 thatjeffsmith 的回复后,我关注服务参数和绑定变量,我意识到我的设置完全 错误 。我想分享一下我是如何改正 我的错误 的。

在 POST 处理程序中,我在请求正文中使用传递给服务的绑定变量,但我将相应的参数定义为 IN/OUT,因此 SOURCE 可以是只有 HEADER 或 URI 和绑定变量结果全部为空。

我发现这些文章非常有用:Parameters and binds and resultset

我修改了删除所有IN/OUT参数的处理程序,因为通过请求主体传递的每个变量(或JSON对象)都是自动"matched" 与处理程序中使用的绑定变量。

现在我 working/studying 在结果集上,以便 return 格式正确的 json 对象包含我的应用程序所需的所有信息。