我正在尝试开发一些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的通用(或最佳)方法,也是“监视”绑定变量的方式。
答案 0 :(得分:2)
我尝试在SQL Developer内运行附加到处理程序的anon块,以确保它首先在那里工作。那么,在您进行静态服务定义的SQL Developer中,这行得通吗?
对于其他阅读此问题的人,当您想“调试”并且无权访问ORDS服务器日志时: 如果从ORDS调用时收到500响应,则在“调试”模式下运行ORDS可能会有所帮助。
有两个属性可以启用,调试和打印到屏幕。 (docs)
这将显示浏览器后端的堆栈转储-不是您想在“产品”中进行的操作,但是由于您正在调试,因此我假设您处于安全的位置。
打开后,再次拨打电话-
现在您可以看到导致500的ORA错误代码-您还可能看到ORDS如何执行anon plsql块-也许您未正确处理输入...
对于您的具体情况,在调用INSERTACCOUNT()时,您可能有错别字,或者您忽略了一个值。
在没有看到INSERTACCOUNT()的规范的情况下,我们只能猜测可能会发生什么。
答案 1 :(得分:0)
评论了thatjeffsmith的响应后,我专注于服务参数和绑定变量,并且意识到我的设置完全错误。我想分享我如何纠正我的错误。
在POST处理程序中,我使用绑定变量,该变量在请求正文中传递给服务,但我将相应的参数定义为IN / OUT,因此, SOURCE只能是HEADER或URI ,并且绑定变量的结果全部为空。
我发现这些文章非常有用:Parameters and binds和resultset。
我修改处理程序,删除所有IN / OUT参数,因为通过请求正文传递的每个变量(或JSON对象)都会自动与处理程序中使用的绑定变量“匹配”。
现在我正在研究/研究结果集,以便将格式正确的json对象以及所有需要的信息返回给我的应用程序。