An overview of ORDS for building RESTful Web Services and your Oracle Database with BEER examples!
Thanks and credit to the POUG organization for making this possible.
How to Troubleshoot Apps for the Modern Connected Worker
Oracle REST Data Services: POUG Edition
1. RESTful Web Services for
Oracle, POUG Edition
ORDS Product Manager
https://www.thatjeffsmith.com
@thatjeffsmith
Jeff Smith 🍻
2. • Presented originally in 2019 for POUG in Wroclav, Poland
• Pints with Oracle User Group
• Combines two of my favorite things, ORDS & Beer (beeords!)
• Please drink responsibly
• I have non-alcoholic slides/content on my blog
About these slides…
Jeff annoys people on twitter @thatjeffsmith
3. • product manager/storyteller
• I help/bother people online
• Working with Oracle Database since 1999
• Helping build database tools since 2001
• I ‘manage’ these products:
whoami
Jeff annoys people on twitter @thatjeffsmith
4. Today’s Agenda
Jeff annoys people on twitter @thatjeffsmith
• Introduction,Terms, & Definitions
• ORDS Architecture
• Building RESTfulWeb Services
6. • REpresentational State Transfer
• Architectural Style for networked applications
• Communicates via HTTP, but..
• Using HTTP doesn’t magically make yourAPIs RESTful
Terms: REST
Jeff annoys people on twitter @thatjeffsmith
7. • Model things, not actions
• UseVERBS to interact,GET, PUT, POST, DELETE
• Stateless, so be sure to use LINKs to guide your users
POST beers/ =>Adds beer, responds w/link
GET beers/:id =>
Jeff annoys people on twitter @thatjeffsmith
RESTful Architecture
🍻
8. • Jay-Sun
• Not just for js!
• Skinnier than XML
• Flexible
• Link-friendly
Terms: {JSON}
Jeff annoys people on twitter @thatjeffsmith
9. {JSON} BonusTip!
Our tools make it easy to
get your database data in
JSON format, pretty or RAW
Jeff annoys people on twitter @thatjeffsmith
…
10. ORDS Features and Architecture
Jeff annoys people on twitter @thatjeffsmith
• How are RESTfulWeb Services defined
• How is ORDS deployed
11. • Automatic
• Your Code
• SQL on the fly
• ManagementAPIs
• SQLDevWeb
Delivery Options
Jeff annoys people on twitter @thatjeffsmith
12. GET https://host/ords/hr/beers/1 SELECT *
FROM UNTAPPD
WHERE ID = 1
HTTP/1.1 200 OK
{ “id": 100,
“name": “Bud Lite“,
“score": “0",
“comments": “yuck” }
{json}
URI SQL & PLSQL
Marshalls to Database
HTTP Request
HTTP Response Transforms to JSON SQL Result Set / Standard OUT
Oracle REST Data Services
ORDS: HTTP to SQL and back
Jeff annoys people on twitter @thatjeffsmith
14. java –jar ords.war standalone
• Supported for production!
• ORDS is your webserver &
web listener for your
Oracle Databases
ORDS
Static Files
-HTML
, CSS,
JS
/db1/hr/emp/
JSON
Binary
HTML
…
HTTP(s)
Response
JDBC
pool1 pool2 pool3
Request
JDBC JDBC
Jeff annoys people on twitter @thatjeffsmith
ORDS Architecture
Option #2 : Standalone
15. • JDBC Conn Pools
• 1 Pool Per Database
• ORDS_PUBLIC_USER
• Proxy Connects
Enabled DB Users
ORDS & Database Communication
Jeff annoys people on twitter @thatjeffsmith
16. • PUT – HTTP Verb
• HTTPS – secure, encrypted version of HTTP (recommended!)
• Server:8080 – network location where ORDS is running
• ords – ords.war, Java servlet
• hr – schema alias, where service is defined
• examples – module, a collection of services
• beers/:id – template, defines the resource
Unwinding an ORDS Request
Jeff annoys people on twitter @thatjeffsmith
PUT https://server:8080/ords/hr/examples/beers/:id
17. Install & Start
ORDS
REST Enable
Application
SCHEMA
Publish RESTful
Service or REST
Enable object
1 2 3
Getting Started Steps
Jeff annoys people on twitter @thatjeffsmith
18. Jeff annoys people on twitter @thatjeffsmith
Step 1, Install ORDS
Video: I talk about the process, DO an install, use SQLDevWeb to build
a RESTfulWeb Service
19. • Services defined in schema
• Services executed as user
Step 2. REST Enable Schema
Jeff annoys people on twitter @thatjeffsmith
Services constrained by Database User:
20. • AUTO REST
• RESTful Services
Step 3. Define your Service
Jeff annoys people on twitter @thatjeffsmith
22. Twoje zdrowie! Or Cheers!
• UNTAPPD: my personal beer diary
• YES, these are MY pictures and MY comments
• Examples will show building REST APIs for my diary
🍻
Jeff annoys people on twitter @thatjeffsmith
23. Example – Beers w/pictures
SELECT beer_name,
brewery_name,
created_at,
photo_url "$pics",
comments
FROM untappd
WHERE photo_url IS NOT NULL
ORDER BY checkin_id DESC
Jeff annoys people on twitter @thatjeffsmith
GET all beers, with links to pictures
24. Example – Using Query String Parameters
?q={"beer_type":{"$like":"Stout%25"}}
Jeff annoys people on twitter @thatjeffsmith
SAME SQL, but…
ORDS injects the WHERE clause
for us.
No additional coding required!
25. Example: More Query String Parameters
?q={"beer_type":{"$like":"%25Tripel%25"}}
Jeff annoys people on twitter @thatjeffsmith
26. Filtering, Sorting and More
ORDS Handles the
SQL for you
Jeff annoys people on twitter @thatjeffsmith
30. Where/how to code your Services
Jeff annoys people on twitter @thatjeffsmith
31. Oracle SQL Developer
• Full ORDS Integration
• Develop RESTful Services
• REST Enable Objects
• Manage ORDS Roles and
Privileges
• Free! OS X,Windows, or Linux
IDE
Jeff annoys people on twitter @thatjeffsmith
32. DatabaseActions/SQLDev Web
• ORDS Single Page App
• Develop RESTful Services
• REST Enable Objects
• Manage ORDS Roles and
Privileges, OAuth2 Clients
• Free! Any major browser.
Browser
Jeff annoys people on twitter @thatjeffsmith
33. CLI & PL/SQL APIs
Jeff annoys people on twitter @thatjeffsmith
SQLcl Anywhere you can run PL/SQL
34. Or Application Express (APEX)
Jeff annoys people on twitter @thatjeffsmith
APEX is NOT required
35. Time to start building!
Jeff annoys people on twitter @thatjeffsmith
36. Home Brewing or Store Bought?
Your Code Someone Else’s
Jeff annoys people on twitter @thatjeffsmith
37. AUTOREST
• CRUD APIs, no SQL to write
• Single ORDS call to create
• Maintained by ORCL
• Feature Packed
• Optimized
RESTful Services
• You control:
• Inputs, outputs, error handling,
response codes, formatting
• Your SQL/PLSQL code
• Easily exported, source
controlled
• Transparent
Choose your own adventure!
Jeff annoys people on twitter @thatjeffsmith
39. • Auto RESTTable
– Full CRUD API, Data Loading, Metadata (DESC)
• Auto RESTView
– Read interface (GET),Write (PUT+POST+DELETE w/PK onVIEW)
• Auto PL/SQL (RPC)
– POST to execute stored PL/SQL
– We accept {json} in, map to input params, grab output and {json} out
Automatic – ORDS owns the code
Jeff annoys people on twitter @thatjeffsmith
40. • GET
• PUT
• POST
• DELETE
• DESC
• DOCS
AutoREST Table /ords/hr/beers/
/ords/hr/beers/:PK
Jeff annoys people on twitter @thatjeffsmith
42. REST EnabledTABLE Swagger API Doc
• Table Metadata
• SELECT
Query Filtering/Order/ASOF SCN or Timestamp
• INSERT
• UPDATE
• DELETE
• BATCHLOAD
Jeff annoys people on twitter @thatjeffsmith
43. Jeff annoys people on twitter @thatjeffsmith
Two Quick AUTOREST TABLE Examples
1. GET one or more rows with a query
2. PUT updates to an existing row
44. • All rows /
• One row /:id – PKValue
– No PK, default to ROWID
– Multi-column PK /x,y,z
• Some rows /?q={json}
SELECT (GET)
Jeff annoys people on twitter @thatjeffsmith
45. METHOD : PUT /:PK
REQUEST BODY : JSON
RESPONSE: 200 OK
• Location (Header)
• JSON (Body)
UPDATE (PUT) : adding comments
REQUEST BODY
Jeff annoys people on twitter @thatjeffsmith
RESPONSE
46. Jeff annoys people on twitter @thatjeffsmith
We also support your PL/SQL Code!
1. Instant access to all of your application logic
2. ORDS ‘wrappers’ your existing PL/SQL with HTTPS
47. • POST /ords/hr/procA
• JSON Responses & Results (OUTs/RETURNs/REFCURSORs)
Accessing your PL/SQL Code, Automatically
Jeff annoys people on twitter @thatjeffsmith
49. Remote Procedure Call over HTTP (POST)
Request
p(arg =>input)
Procedure output formatted {json} – links and all
Jeff annoys people on twitter @thatjeffsmith
50. RESTful Services, write your own code
Jeff annoys people on twitter @thatjeffsmith
• Modules
• Templates
• Handlers
• SourceTypes
51. • Base URI
• Default pagination size
• Can be protected by
common privileges
Modules
Jeff annoys people on twitter @thatjeffsmith
54. • Collection Query
– Multiple records/paging
• Collection Query Item
– Single record only/no paging
• Media
– Streams the output directly
• PL/SQL
– Print HTML (HTP.P) or Code the Response
yourself (headers and body)
Source Types - Shapes Responses
Jeff annoys people on twitter @thatjeffsmith
55. RESTful Service Example #1
• aTABLE
• a RESTfulWebservice…
• …that INSERTs a record
Implementation
• Template => media/
• Handler => POST
• Source => PL/SQL
Jeff annoys people on twitter @thatjeffsmith
56. INSERT a record w/a BLOB
Jeff annoys people on twitter @thatjeffsmith
57. • ORDS defines request body & headers w/ :binds
• ORDS defines response body & headers w/ :binds
ORDS makes HTTP & SQL, easy!
INSERT INTO table (blob) VALUES (:body);
:status := 201;
:location := ‘../’ || id;
Jeff annoys people on twitter @thatjeffsmith
58. • We got the BLOB from the HTTP request via :body
• We got the other columns from HTTP request headers
• We INSERT the record
• We set HTTP LOCATION and STATUS
…in ~3 lines of PL/SQL!!!
What just happened?
Jeff annoys people on twitter @thatjeffsmith
59. RESTful Service Example #2
• aTABLE
• a RESTfulWebservice…
• …that gives list of links
Implementation
• Template => beers/:style/pics
• Handler => GET
• Source => SQL
Jeff annoys people on twitter @thatjeffsmith
60. Print a list of Rows w/LINKs to pictures
Jeff annoys people on twitter @thatjeffsmith
61. • SQL SELECT to get the data
• Predicate value pulled from URI via :type bind
• We told ORDS to generate a link with an “$alias”
What just happened?
Jeff annoys people on twitter @thatjeffsmith
62. Time to wind things down, Last Call!
Jeff annoys people on twitter @thatjeffsmith
• Source code, CI/CD
• Documentation
• Authorization
63. Backup/Source Control your REST Code
• GUI
• SQL
• CLI/Liquibase
Generated via:
Jeff annoys people on twitter @thatjeffsmith
64. Document your APIs with OpenAPI
• GUI
• REST
Generated via:
Jeff annoys people on twitter @thatjeffsmith
65. • See MY post on OAUTH2 w/ORDS
• SeeTodd’s post on OAUTH2 w/ORDS & Micronaut
Jeff annoys people on twitter @thatjeffsmith
SECURE Your Services
66. • Slides
• Blogs
• Articles
UKOUG Scene Why REST, andWhat’s in it or Me?
Oracle Magazine AUTO REST & REST Enabled SQL
Other Resources
Jeff annoys people on twitter @thatjeffsmith
Editor's Notes
There have been many many remote procedure call/distributed communication protocols. Many have been very deeply specified with thousands of pages of specifications, but in the end the industry moved away from these protocols to a much looser concept. So loose it cannot even deemed a protocol, rather REST is referred to as an architectural style.
REST won not by being the most advanced, or the most capable, or the most efficient, but by being the easiest to get to grips with. Which is both a blessing and a curse. The world is full of less than optimal REST APIs. Because REST is so approachable folks quickly move to building and shipping APIs without considering some of the more thorny issues that every distributed application has to deal with
How to manage concurrency, how to deal with lost updates, co-ordinate transactions
How to deal with unavailability
How to deal with massive scale
Oracle REST Data Services is designed to deal with many of these issues, we’ve done the hard thinking and chosen approaches to deal with these issues so developers using ORDS don’t need to worry about them so much.
I want to draw a comparison between REST and another foundational technology, UNIX. When I think of UNIX I picture big air conditioned rooms in data centres full of big iron servers. But that’s not the reality of UNIX today. It’s not just data centres and backend servers. The reality is UNIX is all around you, you wear it on your wrist, you carry it in your pocket, it powers the movies you watch when sat on an aeroplane, it controls the car you drive, it is literally everywhere. It is part of the fabric of our reality, but it’s not something out there in front of you. It’s a building block, something atop which much of the rest of the technology in our lives is built upon.
I’m sure everyone in this room knows how to get around in UNIX, I’m sure that wasn’t always the case, there was a time when all I knew was MS-DOS and Windows. UNIX was a foreign land, and even seemed like something that was fading away under the march of Windows, but that time was so long ago and now I can’t picture a future where knowing and being comfortable using UNIX won’t be a valuable skill for at least another decade or two.
I feel REST is following a similar trajectory. It is almost as old as the HTTP protocol itself, and it’s popularity and ubiquity has taken a considerable amount of time to build, but now that it’s value has been recognised, I don’t see it’s utility being displaced until the next paradigm shift in computing technology occurs. It has become one of the building blocks we take for granted. And thus everyone needs to know and understand REST and more importantly every piece of technology involved in distributed computing needs to be a good and competent REST citizen.
New with REST Data services 3.0 it does not require APEX to define your REST Data services. Oracle currently distributes “Oracle APEX Listener”, which will be renamed to Oracle REST Data Services.
Delivered with Database 12.1.0.2
Java Based plugin replacement for Apache mod_plsql
Formally known as Oracle APEX listener available on OTN
Available today on our Database Cloud Schema Service
Perform a GET on the Collection URI to retrieve the resource
In ORDS the response is a JSON document with two main elements:
items: lists the items in the collection
links: provides hyperlinks to help navigate the collection (next) and to identify the URI to use to POST new Items to the Collection