我正在尝试从 plsql 调用 REST Web 服务,使用 POST 方法,并尝试将参数作为查询字符串中的 json 发送。不幸的是,我失败可能是因为我没有正确使用 utl_http(这里是 plsql 新手)。
恐怕我没有正确发送请求并且我没有在查询字符串中提交 json。
实际上,Web 服务的提供者期望这样的东西:BASE URL/postPayment/jsonstring,而恐怕我没有做那件事。
实际上我收到一个 HTTP 405 错误:“请求的资源 () 不允许指定的 HTTP 方法。”
我试图四处搜索,发送 json 的最佳方式是什么(最初我尝试使用 APEX_WEB_SERVICE.MAKE_REST_REQUEST 但返回的结果为空)但似乎我找不到关于我的情况的进一步指导。
有人可以通过在我的情况下指出正确的 uttl_http 使用形式,或者通过在下面指出我的错误来指导我应该如何进行?
create or replace procedure another_way
(
customerNo IN VARCHAR2,
invoiceNo IN VARCHAR2,
agreementNo IN VARCHAR2,
instance IN VARCHAR2,
paymentRefId IN VARCHAR2,
paymentDate IN VARCHAR2,
principalAmt IN VARCHAR2,
interest IN VARCHAR2,
totalAmt IN VARCHAR2,
passCode IN VARCHAR2,
invoiceType IN VARCHAR2,
phoneNo IN VARCHAR2
) is
req utl_http.req;
res utl_http.resp;
url varchar2(4000) := 'http://baseurl:7474/mpower/rest/postPayment/';
name varchar2(4000);
buffer varchar2(4000);
content varchar2(4000) := '{"customerNo":"'||customerNo||'","invoiceNo":"'||invoiceNo||'","agreementNo":"","instance":"'||instance||'","paymentRefId":"'||paymentRefId||'","paymentDate":"'||paymentDate||'","principalAmt":'||principalAmt||',"interest":'||interest||',"totalAmt":'||totalAmt||',"passCode":"'||passCode||'","invoiceType":"'||invoiceType||'","phoneNo":"'||phoneNo||'"}';
begin
/* just to indicate it started */
dbms_output.put_line('START');
/* to check if your JSON content is okay and has correct values */
dbms_output.put_line(content);
dbms_output.put_line(url||content);
req := utl_http.begin_request(url||content, 'POST',' HTTP/1.1');
utl_http.set_authentication( req, 'abi','oshee', 'Basic' );
--utl_http.set_header(req, 'user-agent', 'mozilla/4.0');
--utl_http.set_header(req, 'content-type', 'application/json');
--utl_http.set_header(req, 'Content-Length', length(content));
/* not sure if this will work but try to print the utl_http */
res := utl_http.get_response(req);
begin
loop
utl_http.read_line(res, buffer);
dbms_output.put_line(buffer);
end loop;
utl_http.end_response(res);
exception
when utl_http.end_of_body then
utl_http.end_response(res);
end;
/* just to indicate it ended */
dbms_output.put_line('END');
exception
when utl_http.end_of_body
then
utl_http.end_response(res);
/* just to indicate it went to exception part */
DBMS_OUTPUT.put_line (SQLERRM);
dbms_output.put_line('EXCEPTION');
end;
--end another_way;