Ở đây tôi đang đưa ra một ví dụ để gửi JSON và tệp Zip tới REST
dịch vụ web sử dụng Oracle UTL_HTTP
đăng nhiều phần / biểu mẫu-dữ liệu.
Ban đầu, tôi lấy mã ví dụ từ blog của Nick Buytaert và sau đó sửa đổi nó để kết hợp JSON
và tệp Zip.
Gửi JSON và tệp Zip tới dịch vụ web REST bằng UTL_HTTP
Mã PL / SQL sau sẽ thực hiện REST
xác thực dịch vụ web bằng Mã thông báo. Và sau đó, nó sẽ nhận được JSON
và BLOB khỏi bảng. Nó sẽ Zip BLOB
và sau đó kết hợp nó với JSON
bằng cách chuyển đổi nó thành base64
nhập dữ liệu. Sau đó, nó sẽ chuẩn bị tiêu đề và gửi nó.
statementl_attachment blob; l_newline varchar2 (50):=chr (13) || chr(10);lco_boundary constant varchar2(30) :='gc0p4Jq0M2Yt08jU534c0p';l_http_request utl_http.req;l_request_body clob;l_request_body_length number;l_req_body clob;l_http_response utl_http.resp;l_response_header_name varchar2(256);l_response_header_value varchar2(1024);l_response_body varchar2 (32767); l_offset number:=1; l_amount number:=2000; l_buffer varchar2 (2000); l_clob clob; l_token varchar2 (32767); begin-- lấy tokenl_clob:=apex_web_service.make_rest_request (p_url => 'https:/ / YourTokenURL ', p_http_method =>' GET '); l_status:=apex_web_service.g_status_code; APEX_JSON.parse (l_clob); l_token:=APEX_JSON.get_varchar2 (p_path => 'token'); - chuẩn bị hoặc lấy jsonl_req_body:='{name:"Scott", tuổi:33, thành phố:"Huston"}'; l_request_body:=l_newline || '-' || lco_boundary || l_newline || 'Nội dung-Bố trí:biểu mẫu-dữ liệu; name ="contact-info" '|| l_newline || 'Content-Type:application / json' || l_newline || l_newline || l_req_body; - || l_newline-- || '-' || lco_boundary || '-'; - lấy đốm màu từ bảng và nén nó lại.; END LOOP; apex_zip.finish (p_zipped_blob => l_attachment); - ghép tệp zip dưới dạng dữ liệu base64 với jsonl_request_body ở trên:=l_request_body || l_newline || '-' || lco_boundary || l_newline || 'Nội dung-Bố trí:biểu mẫu-dữ liệu; name ="tệp đính kèm" '|| l_newline || 'Loại-Nội dung:ứng dụng / zip' || l_newline || 'Nội dung-Chuyển-Mã hoá:base64' || l_newline || l_newline || apex_web_service.blob2clobbase64 (l_attachment) || l_newline || '-' || lco_boundary || '-'; dbms_output.put_line ('Nội dung yêu cầu>'); dbms_output.put_line (dbms_lob.substr (l_request_body, 4000, 1)); l_request_body_length:=dbms_lob.getlength (l_request_body); - authenticate (ví tiền => 'file:/ your / wallet / path', password => 'YourWalletPsw'); - bắt đầu gửi datal_http_request:=utl_http.begin_request (url => 'https:// yourRESTservicePostURL', method => 'POST' , http_version => 'HTTP / 1.1'); - set headerutl_http.set_header (l_http_request, 'Authorization', 'Bearer' || l_token); utl_http.set_header (l_http_request, 'Content-Type', 'multiart / form-data; ranh giới ="'|| lco_boundary ||'" '); utl_http.set_header (l_http_request,' Content-Length ', l_request_body_length); utl_http.set_header (l_http_request,' Transfer-Encoding ',' Chunked '); utl (l_http_request, 'Connection', 'keep-lives'); - gửi dữ liệu theo từng đoạn trong khi l_offsetMã trạng thái:' || l_http_response.status_code); dbms_output.put_line ('Câu trả lời> Cụm từ lý do:' || l_http_response.reason_phrase); dbms_output.put_line ('Phản hồi> Phiên bản HTTP:' || l_htt_head_response.http_version.get_head_response. 1. (l_http_response) looputl_http.get_header (l_http_response, tôi, l_response_header_name, l_response_header_value); dbms_output.put_line ('Phản hồi>' || l_response_header_name ||'read_head_lặp_với_dịch_tối_tiếng_text_revale7);; dbms_output.put_line ('Nội dung phản hồi>'); dbms_output.put_line (l_response_body); nếu l_http_request.private_hndl không phải là null thìutl_http.end_request (l_http_request); end if; if l_ever_ notrequest kết thúc nếu; ngoại lệ khi những người khác nhận được l_http_request.private_hndl không phải là null thìutl_http.end_request (l_http_request); kết thúc nếu; nếu l_http_response.private_hndl không null thìutl_http.end_response ende (lrespons> ende Mã này hoạt động giống như một sự quyến rũ. Vui lòng cho tôi biết trong phần bình luận nếu bạn có bất kỳ vấn đề nào.