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

时间:2018-10-29 11:28:09

标签: oracle rest oracle-ords

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

我已经开发并测试了GET API,以证明该数据库已启用REST。

我尝试开发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的通用(或最佳)方法,也是“监视”绑定变量的方式。

2 个答案:

答案 0 :(得分:2)

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

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

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

这将显示浏览器后端的堆栈转储-不是您想在“产品”中进行的操作,但是由于您正在调试,因此我假设您处于安全的位置。

打开后,再次拨打电话-

enter image description here

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

I talk about this here.

对于您的具体情况,在调用INSERTACCOUNT()时,您可能有错别字,或者您忽略了一个值。

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

答案 1 :(得分:0)

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

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

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

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

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