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 块 - 也许您没有正确处理输入...
对于您的具体情况,在调用 INSERTACCOUNT() 时,您要么输入错误,要么忽略了一个值。
在没有看到 INSERTACCOUNT() 的规范的情况下,我们只能猜测可能会发生什么。
评论 thatjeffsmith 的回复后,我关注服务参数和绑定变量,我意识到我的设置完全 错误 。我想分享一下我是如何改正 我的错误 的。
在 POST 处理程序中,我在请求正文中使用传递给服务的绑定变量,但我将相应的参数定义为 IN/OUT,因此 SOURCE 可以是只有 HEADER 或 URI 和绑定变量结果全部为空。
我发现这些文章非常有用:Parameters and binds and resultset。
我修改了删除所有IN/OUT参数的处理程序,因为通过请求主体传递的每个变量(或JSON对象)都是自动"matched" 与处理程序中使用的绑定变量。
现在我 working/studying 在结果集上,以便 return 格式正确的 json 对象包含我的应用程序所需的所有信息。
我正在尝试开发一些 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 块 - 也许您没有正确处理输入...
对于您的具体情况,在调用 INSERTACCOUNT() 时,您要么输入错误,要么忽略了一个值。
在没有看到 INSERTACCOUNT() 的规范的情况下,我们只能猜测可能会发生什么。
评论 thatjeffsmith 的回复后,我关注服务参数和绑定变量,我意识到我的设置完全 错误 。我想分享一下我是如何改正 我的错误 的。
在 POST 处理程序中,我在请求正文中使用传递给服务的绑定变量,但我将相应的参数定义为 IN/OUT,因此 SOURCE 可以是只有 HEADER 或 URI 和绑定变量结果全部为空。
我发现这些文章非常有用:Parameters and binds and resultset。
我修改了删除所有IN/OUT参数的处理程序,因为通过请求主体传递的每个变量(或JSON对象)都是自动"matched" 与处理程序中使用的绑定变量。
现在我 working/studying 在结果集上,以便 return 格式正确的 json 对象包含我的应用程序所需的所有信息。