SlideShare a Scribd company logo
MICHIGAN ORACLE USERS SUMMIT 2020
MONDAY OCTOBER 26 – THURSDAY OCTOBER 29, 2020
VIRTUAL EVENT
AUTOMATING CLOUD OPERATIONS
EVERYTHING YOU WANTED TO KNOW ABOUT CURL AND REST APIS
PRESENTER NAME: AHMED ABOULNAGA
COMPANY:
Automating Cloud Operations - Everything you wanted to know about cURL and REST APIs
Automating Cloud Operations - Everything you wanted to know about cURL and REST APIs
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 4 of 56
@Revelation_Tech
Table of Contents
Introduction 3
REST and Cloud 6
Introduction to REST 9
Introduction to cURL 23
Creating an Oracle Autonomous Database 30
Figuring Out Authentication and Headers 41
Demo 56
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 5 of 56
@Revelation_Tech
INTRODUCTION
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 6 of 56
@Revelation_Tech
About Me
Ahmed Aboulnaga
• Master’s degree in Computer Science from George Mason University
• Recent emphasis on cloud, DevOps, middleware, security in current projects
• Oracle ACE Pro, OCE, OCA
• Author, Blogger, Presenter
• @Ahmed_Aboulnaga
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 7 of 56
@Revelation_Tech
REST AND CLOUD
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 8 of 56
@Revelation_Tech
Cloud APIs
• All cloud vendors provide some type of API to their services.
• This allows for programmatic access to cloud services.
• A basic understanding of cURL, REST, and JSON is helpful.
• Most cloud providers use the REST architectural style for their APIs.
Client REST API Cloud Service
JSON / XML
GET / POST / PUT / DELETE
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 9 of 56
@Revelation_Tech
Goal of this Presentation
• Better understanding REST and JSON.
• Understand and interpret REST API documentation.
• Familiarization with authorization when calling REST APIs.
• Become capable of automating your cloud operations through REST APIs.
Target
Audience
https://globalacademy-eg.com/training-courses/oracle-dba.htm
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 10 of 56
@Revelation_Tech
MY STORY
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 11 of 56
@Revelation_Tech
My Use Case
What I was trying to do?
• Create an Identity Domain in
Oracle Access Manager.
• OAM 12.2.1.3 had a web-
based console for all OAuth
configuration.
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 12 of 56
@Revelation_Tech
My Use Case
What was my challenge?
• OAM 12.2.1.4 provided
no web-based interface
and only supported a
REST API.
https://docs.oracle.com/en/middleware/idm/access-manager/12.2.1.3/oroau/op-oam-services-rest-ssa-api-v1-oauthpolicyadmin-oauthidentitydomain-post.html
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 13 of 56
@Revelation_Tech
Start with the Documentation
Was the documentation helpful?
• Not all REST API
documentation is created
equally.
• Fortunately, the OAM REST
API documentation provided
an example request and
example response.
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 14 of 56
@Revelation_Tech
Preparing to Login
What did I do first?
• Passwords can be passed as a
“username:password”
combination or encoded.
• Encoding converts literal text to
a humanly unreadable format.
• Used online to encode
“weblogic:welcome1”.
Authentication Options:
curl -u 'weblogic':'welcome1'
curl -H 'Authorization:Basic d2VibG9naWM6d2VsY29tZTE='
https://www.base64encode.org
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 15 of 56
@Revelation_Tech
Did it work?
• Initial invocation failed command:
curl -H 'Content-Type: application/x-www-form-urlencoded'
-H 'Authorization:Basic d1VibG9naWM6d2VsY29tZTE='
--request POST
http://soadev.revtech.com:7701/oam/services/rest/ssa/api
/v1/oauthpolicyadmin/oauthidentitydomain
-d '
{
"name" : "AhmedWebGateDomain",
"identityProvider" : "AhmedOUDStore",
"description" : "Ahmed OIDC Domain"
}
'
• Output:
Mandatory param not found. Entity - IdentityDomain,
paramName - name
• The documentation states that only “name” is mandatory.
So what’s the problem?
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 16 of 56
@Revelation_Tech
What was the successful outcome?
• Final successful command:
curl -H 'Content-Type: application/x-www-form-urlencoded' -H 'Authorization:Basic
d1VibG9naWM6d2VsY29tZTE='
'http://soadev.revtech.com:7701/oam/services/rest/ssa/api/v1/oauthpolicyadmin/oauthidentit
ydomain' -d '{"name":"AhmedWebGateDomain", "identityProvider":"AhmedOUDStore",
"description":"Ahmed OIDC WebGate Domain",
"tokenSettings":[{"tokenType":"ACCESS_TOKEN","tokenExpiry":3600,"lifeCycleEnabled":false,"
refreshTokenEnabled":false,"refreshTokenExpiry":86400,"refreshTokenLifeCycleEnabled":false
},
{"tokenType":"AUTHZ_CODE","tokenExpiry":3600,"lifeCycleEnabled":false,"refreshTokenEnabled
":false,"refreshTokenExpiry":86400,"refreshTokenLifeCycleEnabled":false},
{"tokenType":"SSO_LINK_TOKEN","tokenExpiry":3600,"lifeCycleEnabled":false,"refreshTokenEna
bled":false,"refreshTokenExpiry":86400,"refreshTokenLifeCycleEnabled":false}],
"errorPageURL":"/oam/pages/servererror.jsp", "consentPageURL":"/oam/pages/consent.jsp"}’
• Impossible to determine accurate command without support, examples, or thorough
documentation.
• Required Oracle Support assistance to get these details.
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 17 of 56
@Revelation_Tech
INTRODUCTION TO REST
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 18 of 56
@Revelation_Tech
What is REST?
• REpresentational State Transfer.
• Architectural style for distributed hypermedia system.
• Proposed in 2000 by Roy Fielding in his dissertation.
• Web Service implemented with REST is called RESTful web service.
• REST is not a protocol like SOAP
. It is rather an architectural style.
• REST services typically use HTTP/HTTPS, but can be implemented with other
protocols like FTP
.
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 19 of 56
@Revelation_Tech
REST Architectural Considerations
Uniform interface: Easy to understand and readable results and
can be consumed by any client or programming language over
basic protocols.
URI-based access: Using the same approach to a human
browsing a website where all resource are linked together.
Stateless communication: Extremely scalable since no client
context is stored on the server between requests.
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 20 of 56
@Revelation_Tech
REST Methods
• The HTTP protocol provides multiple methods which you can utilize for RESTful web services.
• The table maps the HTTP method to the typical REST operation.
• Some firewalls may limit some HTTP methods for security reasons.
HTTP Method REST Operation
GET Read
POST Create
PUT Update
DELETE Delete
OPTIONS List of available methods
HEAD Get version
PATCH Update property/attribute
Most common
in web
applications
Most common in
REST to provide
CRUD
functionality
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 21 of 56
@Revelation_Tech
Resources
• Requests are sent to resources (i.e., URLs).
• Each resource represents an object which identified by a noun (e.g., employee, phone,
address, etc.).
• Each resource has a unique URL.
• Typically when performing a POST (create) or PUT (update), you must pass additional values.
Resource HTTP Method REST Output
https://hostname/hr/employee GET Retrieve a list of all employees
https://hostname/hr/employee/12 GET Retrieve details for employee #12
https://hostname/hr/employee POST Create a new employee
https://hostname/hr/employee/12 PUT Update employee #12
https://hostname/hr/employee/12 DELETE Delete employee #12
https://hostname/hr/employee/12/address GET Retrieve address for employee #12
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 22 of 56
@Revelation_Tech
HTTP Response Codes
• HTTP response codes determine the overall response of the REST invocation.
HTTP Code Status Description
2XX (200, 201, 204) OK Data was received and operation was performed
3XX (301, 302) Redirect Request redirected to another URL
4XX (403, 404) Client Error Resource not available to client
5XX (500) Server Error Server error
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 23 of 56
@Revelation_Tech
JSON
• JavaScript Object Notation.
• Pronounced “Jason”.
• An object surrounded by { }.
• An array or ordered list.
• REST can support both
JSON and XML.
• Less verbose than XML, but
lacks metadata support.
//JSON Object
{
"employee": {
"id": 12,
"name": "Kobe",
"location": "USA"
}
}
//JSON Array
{
"employees": [
{
"id": 12,
"name": "Kobe",
"location": "USA"
},
{
"id": 13,
"name": "Jordan",
"location": "Canada"
},
{
"id": 14,
"name": "Barkley",
"location": "USA"
}
]
}
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 24 of 56
@Revelation_Tech
INTRODUCTION TO CURL
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 25 of 56
@Revelation_Tech
What is cURL?
• Open-source command-line tool.
• Supports more than 22 different
protocols (e.g., HTTP
, HTTPS, FTP
, etc.).
• For HTTP
, supports all methods (e.g.,
GET, POST, PUT, DELETE, etc.).
• Very useful for testing RESTful web
services.
• Other advanced tools available include
Postman, SoapUI, Oracle SQL Developer,
etc.
• Example service:
https://api.weather.gov/alerts/active?area=MI
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 26 of 56
@Revelation_Tech
Viewing Header Attributes
• Fetch the HTTP header attributes only using the –i or -I option:
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 27 of 56
@Revelation_Tech
Authentication Options
• Many authentication options are supported; access token, bearer token, OAuth,
basic auth, username/password, client certificate, etc.
Authentication Examples:
curl -H 'token:T3jaD5aDHJLr3idjCma894DAWzk49opp'
curl -u 'weblogic':'welcome1'
curl -H 'Authorization:Basic d2VibG9naWM6d2VsY29tZTE='
Token-based Authentication:
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 28 of 56
@Revelation_Tech
Postman
• Popular API client.
• Free version available.
• www.postman.com
• Numerous features that
include:
- Create API
documentation
- Automated testing
- Design and mock APIs
- Monitor APIs
- Etc.
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 29 of 56
@Revelation_Tech
Benefits of cURL
• Free.
• Command-line based tool.
• Useful for non-interactive scripts.
• Can pass HTTP headers, cookies, and authentication information.
• Support for SSL, proxy, numerous protocols (e.g., LDAP
, SMB, SCP
, IMAP
, FILE,
TELNET, etc.), etc.
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 30 of 56
@Revelation_Tech
Recap
• Recap of previous cURL request:
curl -H 'Content-Type: application/x-www-form-urlencoded'
-H 'Authorization:Basic d1VibG9naWM6d2VsY29tZTE='
-X POST
http://revtech.com:7701/oam/services/rest/ssa/api/v1/oauthpolicyadmin/oauthidentitydomain
-d '
{
"name" : "AhmedWebGateDomain",
"identityProvider" : "AhmedOUDStore",
"description" : "Ahmed OIDC Domain"
}
'
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 31 of 56
@Revelation_Tech
CREATING AN AUTONOMOUS DATABASE
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 32 of 56
@Revelation_Tech
Manually Create an Autonomous Database (1 of 4)
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 33 of 56
@Revelation_Tech
Manually Create an Autonomous Database (2 of 4)
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 34 of 56
@Revelation_Tech
Manually Create an Autonomous Database (3 of 4)
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 35 of 56
@Revelation_Tech
Manually Create an Autonomous Database (4 of 4)
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 36 of 56
@Revelation_Tech
Navigate to Documentation
• CreateAutonomousDatabase Reference
https://docs.cloud.oracle.com/en-us/iaas/api/#/en/database/20160918/AutonomousDatabase/CreateAutonomousDatabase
Note:
• API reference
• CreateAutonomous
Database operation
• REST API endpoint
• API version
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 37 of 56
@Revelation_Tech
View Resource Details and Example
• The resource details provides a list of all required parameters, often beyond what is
demonstrated in the example.
• Use the example as a starting point.
{
"compartmentId" : "ocid1.tenancy.oc1..d6cpxn…dbx",
"displayName" : "MOUS DB 2020 Auto",
"dbName" : "MOUSDBAUTO",
"adminPassword" : "Kobe_24_24_24",
"cpuCoreCount" : 1,
"dataStorageSizeInTBs" : 1
}
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 38 of 56
@Revelation_Tech
First Attempt… Failed!
• Unable to authenticate upon first try despite all parameters/settings correct per
the documentation…
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 39 of 56
@Revelation_Tech
Execute Command
• Eventually got it working…
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 40 of 56
@Revelation_Tech
Provisioning…
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 41 of 56
@Revelation_Tech
Available!
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 42 of 56
@Revelation_Tech
FIGURING OUT AUTHENTICATION &HEADERS
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 43 of 56
@Revelation_Tech
Discovery is Painful
API References and
Endpoints
https://docs.cloud.oracle.com/en-
us/iaas/api/#/en/database/20160918/
Oracle Cloud Infrastructure
Documentation
https://docs.cloud.oracle.com/en-
us/iaas/Content/API/Concepts/apisigningkey.htm#How
Managing Autonomous
Data Warehouse Using oci-
curl
https://blogs.oracle.com/datawarehousing/managing-
autonomous-data-warehouse-using-oci-curl
Oracle Cloud Infrastructure
(OCI) REST call
walkthrough with curl
https://www.ateam-oracle.com/oracle-cloud-
infrastructure-oci-rest-call-walkthrough-with-curl
But why didn’t
the docs point
me to this?
Found this on my
own, has some
helpful info… I don’t want
to use “oci-
curl”!
This is
complicated!
Thank God they
have a script!
Blog?
Another
blog?
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 44 of 56
@Revelation_Tech
Piecing It Together
If you want to use cURL to invoke OCI REST APIs…
1. Get information from the OCI Console
a. Get the Tenancy ID
b. Get the User ID
2. Generate and configure an API Signing Key
a. Create public/private key pair
b. Get the fingerprint of the key
c. Get the public key from the private key in PEM format
d. Add the API Key to the OCI user (by uploading the public key)
3. Prepare and execute script
a. Ensure private key is available
b. Create the JSON request
c. Update the custom script
d. Execute!
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 45 of 56
@Revelation_Tech
1a. Get the Tenancy ID
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 46 of 56
@Revelation_Tech
1b. Get the User ID
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 47 of 56
@Revelation_Tech
2a. Create public/private key pair
• Use ssh-keygen to create a public/private key pair.
• The public key will be added as an “API Key” to your OCI account.
• The private key will be used by your client (i.e., cURL).
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 48 of 56
@Revelation_Tech
2b. Get the fingerprint of the key
• Use openssl to view the X.509 MD5 PEM certificate fingerprint.
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 49 of 56
@Revelation_Tech
2c. Get public key from the private key in PEM format
• OCI requires that the public key is imported in PEM format.
• Use openssl to get the public key in PEM format.
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 50 of 56
@Revelation_Tech
2d. Add the API Key to the OCI user
• The public key is added to the OCI user’s API Key.
• Must be in PEM format.
• Can be uploaded or pasted.
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 51 of 56
@Revelation_Tech
3a. Ensure private key is available
• The private key created earlier (and in PEM format) is used when invoking the
REST service.
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 52 of 56
@Revelation_Tech
3b. Create the JSON request
• The payload is created in JSON format.
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 53 of 56
@Revelation_Tech
3c. Update custom script
• The various elements (tenancy
id, user id, private key, key
fingerprint, etc.) are
parameterized.
• OCI’s REST API requires
additional calculated elements,
all taken care of here (oci-curl
takes care of all of this for you).
• The cURL command is eventually
called using a combination of
static and dynamic values.
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 54 of 56
@Revelation_Tech
3d. Execute!
• The cURL command
is expanded.
• The cURL command
is executed.
• The HTTP status
code is observed to
obtain the result of
the invocation.
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 55 of 56
@Revelation_Tech
Provisioning…
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 56 of 56
@Revelation_Tech
Available!
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 57 of 56
@Revelation_Tech
DEMO
© Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 58 of 56
@Revelation_Tech

More Related Content

PDF
Introducing the Oracle Cloud Infrastructure (OCI) Best Practices Framework
PDF
Everything You Need to Know About the Microsoft Azure and Oracle Cloud Interc...
PDF
Everything You Need to Know About the Microsoft Azure and Oracle Cloud Interc...
PDF
The Microsoft Azure and Oracle Cloud Interconnect Everything You Need to Know
PDF
Compute Cloud Performance Showdown: Amazon Web Services, Oracle Cloud, IBM ...
PDF
Using XA for Batch – Bad idea? (article)
PDF
Compute Cloud Performance Showdown: 18 Months Later (OCI, AWS, IBM Cloud, GCP...
PDF
Cloud Integration Strategy
Introducing the Oracle Cloud Infrastructure (OCI) Best Practices Framework
Everything You Need to Know About the Microsoft Azure and Oracle Cloud Interc...
Everything You Need to Know About the Microsoft Azure and Oracle Cloud Interc...
The Microsoft Azure and Oracle Cloud Interconnect Everything You Need to Know
Compute Cloud Performance Showdown: Amazon Web Services, Oracle Cloud, IBM ...
Using XA for Batch – Bad idea? (article)
Compute Cloud Performance Showdown: 18 Months Later (OCI, AWS, IBM Cloud, GCP...
Cloud Integration Strategy

What's hot (20)

PDF
Hands-On with Oracle SOA Cloud Service
PDF
Domain Partitions and Multitenancy in Oracle WebLogic Server 12c - Why It's U...
PDF
Compute Cloud Performance Showdown: 18 Months Later (OCI, AWS, IBM Cloud, GCP...
PDF
Anyone Can Build a Site, Even You! Create a Microsite with Oracle Sites Cloud...
PDF
Running Kubernetes Workloads on Oracle Cloud Infrastructure
PDF
Building Cloud Native Applications with Oracle Autonomous Database.
PDF
Apex atp customer_presentation_wwc march 2019
PDF
Oracle Cloud Storage Service & Oracle Database Backup Cloud Service
POTX
Oracle OpenWorld - A quick take on all 22 press releases of Day #1 - #3
PPTX
Rh summit2015 presentation_v2.5
PDF
PTK Issue 72: Delivering a Platform on Demand
PDF
2012-08-21 NRO GED Industry Day
PDF
A1 keynote oracle_infrastructure_as_a_service_move_any_workload_to_the_cloud
PDF
Cloud Native Application Development
PDF
Oracle Ravello Presentation 7Dec16 v1
PPTX
Systems on the Edge—Your Stepping Stones into Oracle Public Cloud and the Paa...
PDF
Cloud Presentation and OpenStack case studies -- Harvard University
PDF
Oracle Code in Seoul: Provisioning of Cloud Resource
PDF
MOUG17 Keynote: What's New from Oracle Database Development
PDF
Fn meetup by Sardar Jamal Arif
Hands-On with Oracle SOA Cloud Service
Domain Partitions and Multitenancy in Oracle WebLogic Server 12c - Why It's U...
Compute Cloud Performance Showdown: 18 Months Later (OCI, AWS, IBM Cloud, GCP...
Anyone Can Build a Site, Even You! Create a Microsite with Oracle Sites Cloud...
Running Kubernetes Workloads on Oracle Cloud Infrastructure
Building Cloud Native Applications with Oracle Autonomous Database.
Apex atp customer_presentation_wwc march 2019
Oracle Cloud Storage Service & Oracle Database Backup Cloud Service
Oracle OpenWorld - A quick take on all 22 press releases of Day #1 - #3
Rh summit2015 presentation_v2.5
PTK Issue 72: Delivering a Platform on Demand
2012-08-21 NRO GED Industry Day
A1 keynote oracle_infrastructure_as_a_service_move_any_workload_to_the_cloud
Cloud Native Application Development
Oracle Ravello Presentation 7Dec16 v1
Systems on the Edge—Your Stepping Stones into Oracle Public Cloud and the Paa...
Cloud Presentation and OpenStack case studies -- Harvard University
Oracle Code in Seoul: Provisioning of Cloud Resource
MOUG17 Keynote: What's New from Oracle Database Development
Fn meetup by Sardar Jamal Arif
Ad

Similar to Automating Cloud Operations - Everything you wanted to know about cURL and REST APIs (20)

PDF
Automating Cloud Operations: Everything You Wanted to Know about cURL and REST
PDF
Getting Started with API Management – Why It's Needed On-prem and in the Cloud
PPTX
Boost Your Content Strategy for REST APIs with Gururaj BS
PDF
Getting Started with API Management
PPTX
Oracle REST Data Services
PPT
RESTful services
PDF
Embracing HTTP in the era of API’s
PDF
Алексей Веркеенко "Symfony2 & REST API"
PPTX
Introduction to Web Services
PDF
There is REST and then there is "REST"
PDF
Real-World RESTful Service Development Problems and Solutions
PPTX
RESTful Services
PDF
PDF
Enterprise REST
PPTX
Http and REST APIs.
PPTX
Rest webservice ppt
PPT
RESTful SOA - 中科院暑期讲座
PDF
Differentiating between web APIs, SOA, & integration …and why it matters
PPTX
Apitesting.pptx
Automating Cloud Operations: Everything You Wanted to Know about cURL and REST
Getting Started with API Management – Why It's Needed On-prem and in the Cloud
Boost Your Content Strategy for REST APIs with Gururaj BS
Getting Started with API Management
Oracle REST Data Services
RESTful services
Embracing HTTP in the era of API’s
Алексей Веркеенко "Symfony2 & REST API"
Introduction to Web Services
There is REST and then there is "REST"
Real-World RESTful Service Development Problems and Solutions
RESTful Services
Enterprise REST
Http and REST APIs.
Rest webservice ppt
RESTful SOA - 中科院暑期讲座
Differentiating between web APIs, SOA, & integration …and why it matters
Apitesting.pptx
Ad

More from Revelation Technologies (15)

PDF
Operating System Security in the Cloud
PDF
Getting Started with Terraform
PDF
PTK Issue 71: The Compute Cloud Performance Showdown
PDF
Securing your Oracle Fusion Middleware Environment, On-Prem and in the Cloud
PDF
Oracle BPM Suite Development: Getting Started
PDF
Developing Web Services from Scratch - For DBAs and Database Developers
PDF
Oracle Database Cloud Service - Provisioning Your First DBaaS Instance
PDF
Getting Started with Security for your Oracle SOA Suite Integrations
PDF
Scale Oracle WebLogic Server
PDF
First Impressions: Docker in the Cloud with Oracle Container Cloud Service
PDF
Oracle Compute Cloud vs. Amazon Web Services EC2 -- A Hands-On Showdown
PDF
Oracle Compute Cloud Service vs. Amazon Web Services EC2
PDF
Building Reusable Development Environments with Docker
PDF
Oracle Java & Developer Cloud Service: What It Does & Doesn't Do
PDF
Oracle Compute Cloud Service vs. Amazon Web Services EC2 : A Hands-On Review
Operating System Security in the Cloud
Getting Started with Terraform
PTK Issue 71: The Compute Cloud Performance Showdown
Securing your Oracle Fusion Middleware Environment, On-Prem and in the Cloud
Oracle BPM Suite Development: Getting Started
Developing Web Services from Scratch - For DBAs and Database Developers
Oracle Database Cloud Service - Provisioning Your First DBaaS Instance
Getting Started with Security for your Oracle SOA Suite Integrations
Scale Oracle WebLogic Server
First Impressions: Docker in the Cloud with Oracle Container Cloud Service
Oracle Compute Cloud vs. Amazon Web Services EC2 -- A Hands-On Showdown
Oracle Compute Cloud Service vs. Amazon Web Services EC2
Building Reusable Development Environments with Docker
Oracle Java & Developer Cloud Service: What It Does & Doesn't Do
Oracle Compute Cloud Service vs. Amazon Web Services EC2 : A Hands-On Review

Recently uploaded (20)

PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Approach and Philosophy of On baking technology
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PPTX
A Presentation on Artificial Intelligence
PDF
Machine learning based COVID-19 study performance prediction
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PPTX
Cloud computing and distributed systems.
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Empathic Computing: Creating Shared Understanding
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
NewMind AI Monthly Chronicles - July 2025
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Review of recent advances in non-invasive hemoglobin estimation
Approach and Philosophy of On baking technology
NewMind AI Weekly Chronicles - August'25 Week I
A Presentation on Artificial Intelligence
Machine learning based COVID-19 study performance prediction
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
MYSQL Presentation for SQL database connectivity
Per capita expenditure prediction using model stacking based on satellite ima...
The AUB Centre for AI in Media Proposal.docx
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Cloud computing and distributed systems.
Network Security Unit 5.pdf for BCA BBA.
Building Integrated photovoltaic BIPV_UPV.pdf
Empathic Computing: Creating Shared Understanding
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
NewMind AI Monthly Chronicles - July 2025
20250228 LYD VKU AI Blended-Learning.pptx

Automating Cloud Operations - Everything you wanted to know about cURL and REST APIs

  • 1. MICHIGAN ORACLE USERS SUMMIT 2020 MONDAY OCTOBER 26 – THURSDAY OCTOBER 29, 2020 VIRTUAL EVENT AUTOMATING CLOUD OPERATIONS EVERYTHING YOU WANTED TO KNOW ABOUT CURL AND REST APIS PRESENTER NAME: AHMED ABOULNAGA COMPANY:
  • 4. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 4 of 56 @Revelation_Tech Table of Contents Introduction 3 REST and Cloud 6 Introduction to REST 9 Introduction to cURL 23 Creating an Oracle Autonomous Database 30 Figuring Out Authentication and Headers 41 Demo 56
  • 5. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 5 of 56 @Revelation_Tech INTRODUCTION
  • 6. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 6 of 56 @Revelation_Tech About Me Ahmed Aboulnaga • Master’s degree in Computer Science from George Mason University • Recent emphasis on cloud, DevOps, middleware, security in current projects • Oracle ACE Pro, OCE, OCA • Author, Blogger, Presenter • @Ahmed_Aboulnaga
  • 7. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 7 of 56 @Revelation_Tech REST AND CLOUD
  • 8. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 8 of 56 @Revelation_Tech Cloud APIs • All cloud vendors provide some type of API to their services. • This allows for programmatic access to cloud services. • A basic understanding of cURL, REST, and JSON is helpful. • Most cloud providers use the REST architectural style for their APIs. Client REST API Cloud Service JSON / XML GET / POST / PUT / DELETE
  • 9. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 9 of 56 @Revelation_Tech Goal of this Presentation • Better understanding REST and JSON. • Understand and interpret REST API documentation. • Familiarization with authorization when calling REST APIs. • Become capable of automating your cloud operations through REST APIs. Target Audience https://globalacademy-eg.com/training-courses/oracle-dba.htm
  • 10. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 10 of 56 @Revelation_Tech MY STORY
  • 11. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 11 of 56 @Revelation_Tech My Use Case What I was trying to do? • Create an Identity Domain in Oracle Access Manager. • OAM 12.2.1.3 had a web- based console for all OAuth configuration.
  • 12. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 12 of 56 @Revelation_Tech My Use Case What was my challenge? • OAM 12.2.1.4 provided no web-based interface and only supported a REST API. https://docs.oracle.com/en/middleware/idm/access-manager/12.2.1.3/oroau/op-oam-services-rest-ssa-api-v1-oauthpolicyadmin-oauthidentitydomain-post.html
  • 13. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 13 of 56 @Revelation_Tech Start with the Documentation Was the documentation helpful? • Not all REST API documentation is created equally. • Fortunately, the OAM REST API documentation provided an example request and example response.
  • 14. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 14 of 56 @Revelation_Tech Preparing to Login What did I do first? • Passwords can be passed as a “username:password” combination or encoded. • Encoding converts literal text to a humanly unreadable format. • Used online to encode “weblogic:welcome1”. Authentication Options: curl -u 'weblogic':'welcome1' curl -H 'Authorization:Basic d2VibG9naWM6d2VsY29tZTE=' https://www.base64encode.org
  • 15. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 15 of 56 @Revelation_Tech Did it work? • Initial invocation failed command: curl -H 'Content-Type: application/x-www-form-urlencoded' -H 'Authorization:Basic d1VibG9naWM6d2VsY29tZTE=' --request POST http://soadev.revtech.com:7701/oam/services/rest/ssa/api /v1/oauthpolicyadmin/oauthidentitydomain -d ' { "name" : "AhmedWebGateDomain", "identityProvider" : "AhmedOUDStore", "description" : "Ahmed OIDC Domain" } ' • Output: Mandatory param not found. Entity - IdentityDomain, paramName - name • The documentation states that only “name” is mandatory. So what’s the problem?
  • 16. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 16 of 56 @Revelation_Tech What was the successful outcome? • Final successful command: curl -H 'Content-Type: application/x-www-form-urlencoded' -H 'Authorization:Basic d1VibG9naWM6d2VsY29tZTE=' 'http://soadev.revtech.com:7701/oam/services/rest/ssa/api/v1/oauthpolicyadmin/oauthidentit ydomain' -d '{"name":"AhmedWebGateDomain", "identityProvider":"AhmedOUDStore", "description":"Ahmed OIDC WebGate Domain", "tokenSettings":[{"tokenType":"ACCESS_TOKEN","tokenExpiry":3600,"lifeCycleEnabled":false," refreshTokenEnabled":false,"refreshTokenExpiry":86400,"refreshTokenLifeCycleEnabled":false }, {"tokenType":"AUTHZ_CODE","tokenExpiry":3600,"lifeCycleEnabled":false,"refreshTokenEnabled ":false,"refreshTokenExpiry":86400,"refreshTokenLifeCycleEnabled":false}, {"tokenType":"SSO_LINK_TOKEN","tokenExpiry":3600,"lifeCycleEnabled":false,"refreshTokenEna bled":false,"refreshTokenExpiry":86400,"refreshTokenLifeCycleEnabled":false}], "errorPageURL":"/oam/pages/servererror.jsp", "consentPageURL":"/oam/pages/consent.jsp"}’ • Impossible to determine accurate command without support, examples, or thorough documentation. • Required Oracle Support assistance to get these details.
  • 17. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 17 of 56 @Revelation_Tech INTRODUCTION TO REST
  • 18. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 18 of 56 @Revelation_Tech What is REST? • REpresentational State Transfer. • Architectural style for distributed hypermedia system. • Proposed in 2000 by Roy Fielding in his dissertation. • Web Service implemented with REST is called RESTful web service. • REST is not a protocol like SOAP . It is rather an architectural style. • REST services typically use HTTP/HTTPS, but can be implemented with other protocols like FTP .
  • 19. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 19 of 56 @Revelation_Tech REST Architectural Considerations Uniform interface: Easy to understand and readable results and can be consumed by any client or programming language over basic protocols. URI-based access: Using the same approach to a human browsing a website where all resource are linked together. Stateless communication: Extremely scalable since no client context is stored on the server between requests.
  • 20. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 20 of 56 @Revelation_Tech REST Methods • The HTTP protocol provides multiple methods which you can utilize for RESTful web services. • The table maps the HTTP method to the typical REST operation. • Some firewalls may limit some HTTP methods for security reasons. HTTP Method REST Operation GET Read POST Create PUT Update DELETE Delete OPTIONS List of available methods HEAD Get version PATCH Update property/attribute Most common in web applications Most common in REST to provide CRUD functionality
  • 21. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 21 of 56 @Revelation_Tech Resources • Requests are sent to resources (i.e., URLs). • Each resource represents an object which identified by a noun (e.g., employee, phone, address, etc.). • Each resource has a unique URL. • Typically when performing a POST (create) or PUT (update), you must pass additional values. Resource HTTP Method REST Output https://hostname/hr/employee GET Retrieve a list of all employees https://hostname/hr/employee/12 GET Retrieve details for employee #12 https://hostname/hr/employee POST Create a new employee https://hostname/hr/employee/12 PUT Update employee #12 https://hostname/hr/employee/12 DELETE Delete employee #12 https://hostname/hr/employee/12/address GET Retrieve address for employee #12
  • 22. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 22 of 56 @Revelation_Tech HTTP Response Codes • HTTP response codes determine the overall response of the REST invocation. HTTP Code Status Description 2XX (200, 201, 204) OK Data was received and operation was performed 3XX (301, 302) Redirect Request redirected to another URL 4XX (403, 404) Client Error Resource not available to client 5XX (500) Server Error Server error
  • 23. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 23 of 56 @Revelation_Tech JSON • JavaScript Object Notation. • Pronounced “Jason”. • An object surrounded by { }. • An array or ordered list. • REST can support both JSON and XML. • Less verbose than XML, but lacks metadata support. //JSON Object { "employee": { "id": 12, "name": "Kobe", "location": "USA" } } //JSON Array { "employees": [ { "id": 12, "name": "Kobe", "location": "USA" }, { "id": 13, "name": "Jordan", "location": "Canada" }, { "id": 14, "name": "Barkley", "location": "USA" } ] }
  • 24. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 24 of 56 @Revelation_Tech INTRODUCTION TO CURL
  • 25. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 25 of 56 @Revelation_Tech What is cURL? • Open-source command-line tool. • Supports more than 22 different protocols (e.g., HTTP , HTTPS, FTP , etc.). • For HTTP , supports all methods (e.g., GET, POST, PUT, DELETE, etc.). • Very useful for testing RESTful web services. • Other advanced tools available include Postman, SoapUI, Oracle SQL Developer, etc. • Example service: https://api.weather.gov/alerts/active?area=MI
  • 26. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 26 of 56 @Revelation_Tech Viewing Header Attributes • Fetch the HTTP header attributes only using the –i or -I option:
  • 27. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 27 of 56 @Revelation_Tech Authentication Options • Many authentication options are supported; access token, bearer token, OAuth, basic auth, username/password, client certificate, etc. Authentication Examples: curl -H 'token:T3jaD5aDHJLr3idjCma894DAWzk49opp' curl -u 'weblogic':'welcome1' curl -H 'Authorization:Basic d2VibG9naWM6d2VsY29tZTE=' Token-based Authentication:
  • 28. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 28 of 56 @Revelation_Tech Postman • Popular API client. • Free version available. • www.postman.com • Numerous features that include: - Create API documentation - Automated testing - Design and mock APIs - Monitor APIs - Etc.
  • 29. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 29 of 56 @Revelation_Tech Benefits of cURL • Free. • Command-line based tool. • Useful for non-interactive scripts. • Can pass HTTP headers, cookies, and authentication information. • Support for SSL, proxy, numerous protocols (e.g., LDAP , SMB, SCP , IMAP , FILE, TELNET, etc.), etc.
  • 30. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 30 of 56 @Revelation_Tech Recap • Recap of previous cURL request: curl -H 'Content-Type: application/x-www-form-urlencoded' -H 'Authorization:Basic d1VibG9naWM6d2VsY29tZTE=' -X POST http://revtech.com:7701/oam/services/rest/ssa/api/v1/oauthpolicyadmin/oauthidentitydomain -d ' { "name" : "AhmedWebGateDomain", "identityProvider" : "AhmedOUDStore", "description" : "Ahmed OIDC Domain" } '
  • 31. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 31 of 56 @Revelation_Tech CREATING AN AUTONOMOUS DATABASE
  • 32. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 32 of 56 @Revelation_Tech Manually Create an Autonomous Database (1 of 4)
  • 33. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 33 of 56 @Revelation_Tech Manually Create an Autonomous Database (2 of 4)
  • 34. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 34 of 56 @Revelation_Tech Manually Create an Autonomous Database (3 of 4)
  • 35. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 35 of 56 @Revelation_Tech Manually Create an Autonomous Database (4 of 4)
  • 36. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 36 of 56 @Revelation_Tech Navigate to Documentation • CreateAutonomousDatabase Reference https://docs.cloud.oracle.com/en-us/iaas/api/#/en/database/20160918/AutonomousDatabase/CreateAutonomousDatabase Note: • API reference • CreateAutonomous Database operation • REST API endpoint • API version
  • 37. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 37 of 56 @Revelation_Tech View Resource Details and Example • The resource details provides a list of all required parameters, often beyond what is demonstrated in the example. • Use the example as a starting point. { "compartmentId" : "ocid1.tenancy.oc1..d6cpxn…dbx", "displayName" : "MOUS DB 2020 Auto", "dbName" : "MOUSDBAUTO", "adminPassword" : "Kobe_24_24_24", "cpuCoreCount" : 1, "dataStorageSizeInTBs" : 1 }
  • 38. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 38 of 56 @Revelation_Tech First Attempt… Failed! • Unable to authenticate upon first try despite all parameters/settings correct per the documentation…
  • 39. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 39 of 56 @Revelation_Tech Execute Command • Eventually got it working…
  • 40. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 40 of 56 @Revelation_Tech Provisioning…
  • 41. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 41 of 56 @Revelation_Tech Available!
  • 42. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 42 of 56 @Revelation_Tech FIGURING OUT AUTHENTICATION &HEADERS
  • 43. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 43 of 56 @Revelation_Tech Discovery is Painful API References and Endpoints https://docs.cloud.oracle.com/en- us/iaas/api/#/en/database/20160918/ Oracle Cloud Infrastructure Documentation https://docs.cloud.oracle.com/en- us/iaas/Content/API/Concepts/apisigningkey.htm#How Managing Autonomous Data Warehouse Using oci- curl https://blogs.oracle.com/datawarehousing/managing- autonomous-data-warehouse-using-oci-curl Oracle Cloud Infrastructure (OCI) REST call walkthrough with curl https://www.ateam-oracle.com/oracle-cloud- infrastructure-oci-rest-call-walkthrough-with-curl But why didn’t the docs point me to this? Found this on my own, has some helpful info… I don’t want to use “oci- curl”! This is complicated! Thank God they have a script! Blog? Another blog?
  • 44. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 44 of 56 @Revelation_Tech Piecing It Together If you want to use cURL to invoke OCI REST APIs… 1. Get information from the OCI Console a. Get the Tenancy ID b. Get the User ID 2. Generate and configure an API Signing Key a. Create public/private key pair b. Get the fingerprint of the key c. Get the public key from the private key in PEM format d. Add the API Key to the OCI user (by uploading the public key) 3. Prepare and execute script a. Ensure private key is available b. Create the JSON request c. Update the custom script d. Execute!
  • 45. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 45 of 56 @Revelation_Tech 1a. Get the Tenancy ID
  • 46. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 46 of 56 @Revelation_Tech 1b. Get the User ID
  • 47. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 47 of 56 @Revelation_Tech 2a. Create public/private key pair • Use ssh-keygen to create a public/private key pair. • The public key will be added as an “API Key” to your OCI account. • The private key will be used by your client (i.e., cURL).
  • 48. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 48 of 56 @Revelation_Tech 2b. Get the fingerprint of the key • Use openssl to view the X.509 MD5 PEM certificate fingerprint.
  • 49. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 49 of 56 @Revelation_Tech 2c. Get public key from the private key in PEM format • OCI requires that the public key is imported in PEM format. • Use openssl to get the public key in PEM format.
  • 50. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 50 of 56 @Revelation_Tech 2d. Add the API Key to the OCI user • The public key is added to the OCI user’s API Key. • Must be in PEM format. • Can be uploaded or pasted.
  • 51. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 51 of 56 @Revelation_Tech 3a. Ensure private key is available • The private key created earlier (and in PEM format) is used when invoking the REST service.
  • 52. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 52 of 56 @Revelation_Tech 3b. Create the JSON request • The payload is created in JSON format.
  • 53. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 53 of 56 @Revelation_Tech 3c. Update custom script • The various elements (tenancy id, user id, private key, key fingerprint, etc.) are parameterized. • OCI’s REST API requires additional calculated elements, all taken care of here (oci-curl takes care of all of this for you). • The cURL command is eventually called using a combination of static and dynamic values.
  • 54. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 54 of 56 @Revelation_Tech 3d. Execute! • The cURL command is expanded. • The cURL command is executed. • The HTTP status code is observed to obtain the result of the invocation.
  • 55. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 55 of 56 @Revelation_Tech Provisioning…
  • 56. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 56 of 56 @Revelation_Tech Available!
  • 57. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 57 of 56 @Revelation_Tech DEMO
  • 58. © Revelation Technologies Group, Inc. 2020 | All rights reserved. Slide 58 of 56 @Revelation_Tech