2

我正在尝试开发一些 REST API,并且正在使用:Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production、Oracle ORDS 和 SQL Developer 17.3.1.279。

我已经开发和测试了一个 GET API,以证明数据库是 REST-Enabled。

我尝试开发一个 POST API,我正在阅读这篇文章

我的 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;

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

我用 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 的常用(或最佳)方法以及“监控”绑定变量的方法。

4

2 回答 2

2

我尝试运行附加到 SQL Developer 内部处理程序的 anon 块,以确保它首先在那里工作。那么,在 SQL Developer 中您正在执行 restful 服务定义的情况下,这行得通吗?

对于阅读此问题的其他人,当您想要“调试”并且无权访问 ORDS 服务器日志时:如果从 ORDS 调用它时收到 500 响应,则在“调试”模式下运行 ORDS 会很有帮助。

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

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

一旦开启,再次拨打您的电话 -

在此处输入图像描述

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

我在这里谈这个。

具体而言,对于您的情况,在调用 INSERTACCOUNT() 时,您要么有错字,要么忽略了一个值。

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

于 2018-10-29T12:14:33.340 回答
0

在评论了thatjeffsmith的回复后,我专注于服务参数和绑定变量,我意识到我的设置完全错误。我想分享我如何纠正我的错误

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

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

我修改了删除所有 IN/OUT 参数的处理程序,因为通过请求正文传递的每个变量(或 JSON 对象)都会自动与处理程序中使用的绑定变量“匹配”。

现在我正在研究结果集,以便返回格式正确的 json 对象以及我的应用程序所需的所有信息。

于 2018-11-06T09:44:33.930 回答