问题描述
汤姆,
我正在尝试使用UTL_HTTP函数与pl/sql过程中的文件一起发布web服务。同样的处理工作从Curl脚本。
PL/SQL:
卷曲: 工作脚本
您能否帮助我如何使用utl_https/任何其他oracle函数在pl/sql中编写此curl脚本。
谢谢你的帮助。
赛鲁
我正在尝试使用UTL_HTTP函数与pl/sql过程中的文件一起发布web服务。同样的处理工作从Curl脚本。
PL/SQL:
DECLARE
req utl_http.req;
resp utl_http.resp;
l_value VARCHAR2(1024);
l_url_import VARCHAR2(500) := 'https://api.teamdynamix.com/TDWebApi/api/people';
l_url VARCHAR2(100) := 'https://api.teamdynamix.com/TDWebApi/api/auth/loginadmin';
l_content VARCHAR2(1000) := 'C:\SB\TeamDynamix\Files\xavier_to_teamdynamics.xlsx' ;
BEGIN
req := UTL_HTTP.begin_request( l_url, 'POST', UTL_HTTP.HTTP_VERSION_1_1 );
UTL_HTTP.SET_HEADER(req, 'User-Agent', 'Mozilla/4.0 (compatible)' );
UTL_HTTP.SET_HEADER(req, 'Content-Type', 'application/json');
UTL_HTTP.SET_HEADER(req, 'Accept', 'application/json');
UTL_HTTP.SET_HEADER(req, 'Authorization', 'Bearer BEID: XXXXXX-XXXX-XXX-XXXXXXXX, WebServicesKey: XXXXXX-XXX-XXX-XXXXXXXX' );
--- UTL_HTTP.SET_HEADER(req, 'Content-Length', 100000000);--LENGTH(l_Content));
UTL_HTTP.WRITE_text(req, l_content);
resp := utl_http.get_response(req);
dbms_output.put_line('Response');
LOOP
utl_http.read_line(resp, l_value, TRUE);
dbms_output.put_line('Value......'||l_value);
END LOOP;
utl_http.end_response(resp);
EXCEPTION
WHEN utl_http.end_of_body THEN
utl_http.end_response(resp);
WHEN OTHERS THEN
dbms_output.put_line('Error');
END;
/
卷曲: 工作脚本
. $HOME/.bash_profile
#file name as it will be stored in the dataload folder
file=$UTLFILE/general/xavier_to_teamdynamix.xlsx #PeopleApiImportTemplate.xlsx #xavier_to_teamdynamics.xlsx
#run the curl command and store the output from command in variable return_key
echo "File Name: [$file]"
read return_key < <(curl "https://services.xavier.edu/TDWebApi/api/auth/loginadmin" -H "Content-type: application/json" -d "{'BEID': 'XXXXXX-XXXX-XXX-XXXXXXXX', 'WebServicesKey': 'XXXXXX-XXX-XXX-XXXXXXXX'}")
echo "RK [$return_key]"
#build final command with file and return_key variables
final_command='curl -i -F filedata=@'$file' https://services.xavier.edu/tdwebapi/api/people/import -H "Authorization: Bearer '$return_key'"'
echo "Final --> [$final_command]"
#eval will run the final command string and output the results
eval $final_command
echo " "
echo " "
您能否帮助我如何使用utl_https/任何其他oracle函数在pl/sql中编写此curl脚本。
谢谢你的帮助。
赛鲁
专家解答
要上传文件,您需要将数据 (通常以块形式) 作为raw发送。
以下是一些 * 伪 * 代码,概述了一般方法
有很多关于这个主题的博客文章,例如
https://apexplained.wordpress.com/2016/03/21/utl_http-and-a-multipartform-data-request-body/
但是我可以建议也看看APEX_WEB_SERVICE包吗
http://docs.oracle.com/cd/E59726_01/doc.50/e39149/apex_web_service.htm#AEAPI537
这可能会为你隐藏很多这种复杂性
以下是一些 * 伪 * 代码,概述了一般方法
declare
req utl_http.req;
resp utl_http.resp;
content blob;
req_length int;
offset int;
begin
dbms_lob.loadblobfromfile(content,bfilename('xavier_to_teamdynamix.xlsx',...);
utl_http.set_header(req, 'content-type', 'image/jpeg');
req_length := dbms_lob.getlength(content);
if req_length <= 32767 then
utl_http.set_header(req, 'Content-Length', req_length);
utl_http.write_raw(req, content);
elsif req_length >32767 then
utl_http.set_header(req, 'Transfer-Encoding', 'Chunked');
while (offset < req_length)
loop
dbms_lob.read(content, amount, offset, buffer);
utl_http.write_raw(req, buffer);
offset := offset + amount;
end loop;
end if;
resp := UTL_HTTP.get_response(req);
有很多关于这个主题的博客文章,例如
https://apexplained.wordpress.com/2016/03/21/utl_http-and-a-multipartform-data-request-body/
但是我可以建议也看看APEX_WEB_SERVICE包吗
http://docs.oracle.com/cd/E59726_01/doc.50/e39149/apex_web_service.htm#AEAPI537
这可能会为你隐藏很多这种复杂性
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




