How to call REST API from Oracle APEX

মডার্ন ওয়েব টেকনোলজির যুগে আপ্লিকেশন ডেভেলপমেন্টের সময় আমাদের বিভিন্ন ধরনের API ব্যাবহার করতে হয়। হতে পারে সেটা আবহাওয়ার উপডেট দেবার API অথবা হতে পারে কাস্টমারকে মেসেজ পাঠানোর API.

সার্ভিসের উপর ডিপেন্ড করে বিভিন্ন ভেন্ডর বিভিন্ন ভাবে API ডিজাইন করে থাকে। সাধারণত API এর কাজের উপর ভিত্তি করে API কোন মেথডে কল করবো তা নির্ধারিত হয়ে থাকে। যেমন API থেকে ডাটা তুলে আনার জন্য GET মেথডে কল করা হয়। এছাড়া ডাটা পাঠানোর জন্য POST মেথড, ডাটা আপডেট করার জন্য PUT মেথড ও ডাটা মুছে ফেলার জন্য DELETE মেথড ব্যাবহার করা হয়। একটা API কোন মেথডে কল করা হবে তা API Documentation-এ বলা থাকে।

API এর আরেকটি গুরুত্বপূর্ণ পার্ট হলো অথেনটিকেশন। API কে সিকিউরড করার জন্য বিভিন্ন ধরনের অথেনটিকেশন মেকানিজম ইমপ্লিমেন্ট করা থাকে। যেমন API Key, Basic Authentication, Bearer Token, OAuth ইত্যাদি।

একটা API কে কল করার পর যে সব ডাটা রিটার্ন তাকে রেসপন্স বলে। মডার্ন API গুলাতে সাধারণত JSON ফরম্যাটে রেসপন্স রিটার্ন করে। এছাড়া কিছু কিছু API থেকে XML ফরম্যাটেও রেসপন্স রিটার্ন করে।

Oracle APEX – এ API রিলেটেড কাজ করার করার জন্য APEX_WEB_SERVICE প্যাকেজ ব্যাবহার করা হয়। APEX_WEB_SERVICE এর বেশ কিছু সাব প্রোগ্রাম আছে এর মধ্যে MAKE_REST_REQUEST ফাংশন দিয়ে API কল করা হয়। আসুন প্রথমে MAKE_REST_REQUEST ফাংশন কি কি প্যারামিটার গ্রহন করে তা দেখে নেই –

ParameterDescription
p_urlAPI এর ওয়েব এড্রেস
p_http_methodAPI এর রিকুয়েস্ট মেথড, GET, POST, PUT, DELETE etc.
p_usernameবেসিক অথেনটিকেশন এর ইউজার নেম
p_password বেসিক অথেনটিকেশন এর পাসওয়ার্ড
p_schemeThe authentication scheme, Basic (default) or AWS or Digest or OAUTH_CLIENT_CRED if supported by your database release.
p_proxy_overrideThe proxy to use for the request. The proxy supplied overrides the proxy defined in the application attributes.
p_transfer_timeoutরেস্পন্সের জন্য কতক্ষণ অপেক্ষা করবে
p_bodyAPI দিয়ে পাঠানো রিকুয়েস্ট বডি
p_body_blob API দিয়ে পাঠানো ফাইল
p_parm_nameURL-এ উল্লেখিত প্যারামিটার এর নাম
p_parm_valueURL-এ উল্লেখিত প্যারামিটার এর ভ্যালু
p_wallet_pathSSL সার্টিফিকেট যুক্ত API কে কল করার জন্য ওয়ালেট ক্রিয়েট করতে হয়, সেই ওয়ালেট এর লোকেশন
p_wallet_pwd ওয়ালেট এর পাসওয়ার্ড
p_https_hostThe host name to be matched against the common name (CN) of the remote server’s certificate for an HTTPS request.
p_credential_static_idAPEX এর শেয়ার কম্পোনেন্ট থেকে Web Credentials ইউজ করলে তার স্ট্যাটিক আইডি
p_token_urlটোকেন বেজড অথেনটিকেশন ইউজ করলে, যে URL থেকে টোকেন জেনারেট করবে তার URL

এতক্ষণ আমি একটা API এর বেসিক স্ট্রাকচার নিয়ে আলোচনা করেছি, চলুন এখন একটা উদাহরণ দিয়ে বুঝার চেষ্টা করে দেখি। বলে রাখা ভালো, সার্ভিসের উপর ডিপেন্ড করে API গুলো বিভিন্ন ধরনের হয়ে থাকে তাই একটা উদাহরণ দিয়ে আসলে সব API কল করার পদ্ধতি বুঝানো সম্ভব নয়। আমি এখানে যে উদাহরণটা দিয়েছি তা দিয়ে ম্যাক্সিমাম প্যারামিটার কভার করার চেষ্টা করেছি –

DECLARE
  l_response_clob  CLOB;
  l_rest_url       VARCHAR2(2000) := 'https://example.com/signedurl';
  l_request_body   CLOB;
  l_file           BLOB;
  l_signed_url     VARCHAR2(1000);
  l_tags           VARCHAR2(500);
BEGIN
  -- Build JSON Payload
  l_request_body := '{"bucket_name :"shsshsh",
      "file_path":"images/DEV/Jobs/",
      "file_name":"ShippedReport.xlsx",
      "expiration_seconds":360
	}';

  -- Set header value
  apex_web_service.g_request_headers(1).name  := 'Content-Type';
  apex_web_service.g_request_headers(1).value := 'application/json';
  apex_web_service.g_request_headers(2).name  := 'x-api-key';
  apex_web_service.g_request_headers(2).value := 'dsjhdjsfhdfhgjkfd';
  
  -- Make API call 
  l_response_clob := apex_web_service.make_rest_request(
    p_url         => l_rest_url,
    p_http_method => 'POST',
    p_body        => l_request_body,
    p_parm_name   => apex_string.string_to_table('appid:format',':'),
    p_parm_value  => apex_string.string_to_table('xyz:xml',':'),
    p_wallet_path => 'file:/wallets/aws_apig/',
    p_wallet_pwd  => 'dhjsfhjdfh'
  );

  -- Check HTTP status code 
  dbms_output.put_line ('Code : '||apex_web_service.g_status_code);

  -- Parse the JSON response to get response value
  APEX_JSON.PARSE(l_response_clob);
  l_signed_url := APEX_JSON.GET_VARCHAR2(p_path => 's3signedurl');

  dbms_output.put_line ('URL : '||l_signed_url);
END;

উপরের উদাহরণ প্রথমে JSON ডাটা রেডি করেছি যা API দিয়ে পাঠাবো। এরপর হেডারে কিছু ভ্যালু সেট করেছি, প্রথমে কন্টেন্ট টাইপ বলে দিয়েছি যে আমি JSON ভ্যালু পাঠাবো এবং দ্বিতীয় ভ্যালু দিয়ে API key সেট করেছি। হেডার ভ্যালু সেট হয়ে গেলে এরপর ফাইনালি API কে কল করেছি। API -এ মাল্টিপল প্যারামিটার থাকলে টেবিল অ্যারে হিসাবে পাঠাতে হয়। এ জন্য APEX-এর string_to_table ফাংশন ব্যাবহার করেছি। সব শেষে URL টা যেহেতু SSL সার্টিফিকেট দিয়ে সিকিউর্ড সেজন্য ওরাকল wallet ব্যাবহার করেছি। ওরাকল wallet কিভাবে তৈরি করতে হয় তা আরেকটি পোস্ট-এ দেখিয়ে দিব।

Note: যেকোনো ওয়েব রিকুয়েস্ট পাঠানোর জন্য আগে অবশ্যয় Access Control List (ACL) তৈরি করে নিতে হবে। Access Control List (ACL) কিভাব তৈরি করে তার জন্য এই পোস্টটা দেখুন।

Published by

Ali Asgor

Graduate in GES, OCP holder, Self-motivated app developer, Programming lover, Lazy person...

94 thoughts on “How to call REST API from Oracle APEX”

  1. Thanks & grateful to you. Its very informative, easy to understand apex api call from web serivice. Your writing is very descriptive & useful. Thanks for your contribution. Specially writing bangla made a good understanding on topics. Please keep contribute more to educate our apex Community.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.