REST for any application

Slides:



Advertisements
Similar presentations
Give it a REST already Arnon Rotem-Gal-Oz VP R&D xsights
Advertisements

Introduction to Web Services
Server Access The REST of the Story David Cleary
Building RESTful Interfaces
REST support for B2B access to your AppServer PUG Challenge Americas Michael Jacobs : Senior Software Architect Edsel Garcia : Principal Software.
2/9/2004 Web and HTTP February 9, /9/2004 Assignments Due – Reading and Warmup Work on Message of the Day.
Computer Science 101 Web Access to Databases Overview of Web Access to Databases.
The Easiest Way to Write Web Applications Jordi Sastre IT Architect, PSC May 2012.
Web server and web browser It’s a take and give policy in between client and server through HTTP(Hyper Text Transport Protocol) Server takes a request.
Presented by…. Group 2 1. Programming language 2Introduction.
Networking Nasrullah. Input stream Most clients will use input streams that read data from the file system (FileInputStream), the network (getInputStream()/getInputStream()),
M. Taimoor Khan * Java Server Pages (JSP) is a server-side programming technology that enables the creation of dynamic,
JavaScript & jQuery the missing manual Chapter 11
Designing and Implementing Web Data Services in Perl
Java Omar Rana University of South Asia. Course Overview JAVA  C/C++ and JAVA Comparison  OOP in JAVA  Exception Handling  Streams  Graphics User.
1 PHP and MySQL. 2 Topics  Querying Data with PHP  User-Driven Querying  Writing Data with PHP and MySQL PHP and MySQL.
Web Architecture & Services (2) Representational State Transfer (REST)
REST.  REST is an acronym standing for Representational State Transfer  A software architecture style for building scalable web services  Typically,
JavaScript, Fourth Edition
Wyatt Pearsall November  HyperText Transfer Protocol.
Web Programming: Client/Server Applications Server sends the web pages to the client. –built into Visual Studio for development purposes Client displays.
INFO 344 Web Tools And Development CK Wang University of Washington Spring 2014.
Python and REST Kevin Hibma. What is REST? Why REST? REST stands for Representational State Transfer. (It is sometimes spelled "ReST".) It relies on a.
Open Data Protocol * Han Wang 11/30/2012 *
Or, Hey can’t we just do it using HTTP for the envelope?
DEV-5: Introduction to WebSpeed ® Stephen Ferguson Sr. Training Program Manager.
INTRODUCTION TO JAVASCRIPT AND DOM Internet Engineering Spring 2012.
CIS 451: ASP.NET Objects Dr. Ralph D. Westfall January, 2009.
Cross Site Integration “mashups” cross site scripting.
Nadir Saghar, Tony Pan, Ashish Sharma REST for Data Services.
© 2006 IBM Corporation Agile Planning Web UI. © 2006 IBM Corporation Agenda  Overview of APT Web UI  Current Issues  Required Infrastructure  API.
New perfSonar Dashboard Andy Lake, Tom Wlodek. What is the dashboard? I assume that everybody is familiar with the “old dashboard”:
WEP Presentation for non-IT Steps and roles in software development 2. Skills developed in 1 st year 3. What can do a student in 1 st internship.
DM_PPT_NP_v01 SESIP_0715_JR HDF Server HDF for the Web John Readey The HDF Group Champaign Illinois USA.
API Crash Course CWU Startup Club. OUTLINE What is an API? Why are API’s useful? What is HTTP? JSON? XML? What is a RESTful API? How do we consume an.
2007cs Servers on the Web. The World-Wide Web 2007 cs CSS JS HTML Server Browser JS CSS HTML Transfer of resources using HTTP.
1 WWW. 2 World Wide Web Major application protocol used on the Internet Simple interface Two concepts –Point –Click.
Dean Anderson Polk County, Oregon GIS in Action 2014 Modifying Open Source Software (A Case Study)
1 Java Servlets l Servlets : programs that run within the context of a server, analogous to applets that run within the context of a browser. l Used to.
© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/3 JSP Application Models.
ICM – API Server & Forms Gary Ratcliffe.
RESTful Web Services What is RESTful?
RESTful Web Services A MIDAS MISSION PRESENTATION APRIL 29, 2015.
Web Services An Introduction Copyright © Curt Hill.
Web Technologies Lecture 10 Web services. From W3C – A software system designed to support interoperable machine-to-machine interaction over a network.
Java Programming: Advanced Topics 1 Building Web Applications Chapter 13.
Simple Web Services. Internet Basics The Internet is based on a communication protocol named TCP (Transmission Control Protocol) TCP allows programs running.
Feeling RESTful? Well, first we’ll define a Web Service –A web page meant to be consumed by a computer via an autonomous program as opposed to a web browser.
Orion Contextbroker PROF. DR. SERGIO TAKEO KOFUJI PROF. MS. FÁBIO H. CABRINI PSI – 5120 – TÓPICOS EM COMPUTAÇÃO EM NUVEM
Representational State Transfer COMP6017 Topics on Web Services Dr Nicholas Gibbins –
REST API Design. Application API API = Application Programming Interface APIs expose functionality of an application or service that exists independently.
National College of Science & Information Technology.
Edsel Garcia Shelley Chase Fantastic Web Apps in 11.6 WebSpeed in the Pacific AppServer for OpenEdge.
CS3220 Web and Internet Programming RESTful Web Service
API (Application Program Interface)
Better RESTFul API – Best Practices
Cosc 5/4730 REST services.
Node.js Express Web Services
Representational State Transfer
Ashish Pandit IT Architect, Middleware & Integration Services
WEB API.
$, $$, $$$ API testing Edition
A gentle introduction to RESTful APIs
Middleware, Services, etc.
REST APIs Maxwell Furman Department of MIS Fox School of Business
…and web frameworks in general
REST på Microsoft-stacken
A gentle introduction to RESTful APIs
Chengyu Sun California State University, Los Angeles
Restful APIs 101 Laura
Presentation transcript:

REST for any application Using REST+JSON with OpenEdge ABL, WebSpeed, and Kendo UI Matt Baker mbaker@progress.com

Please feel free to interrupt and ask questions or make comments

Demo

What did I just see?

REST – the service architecture

REST – Not These Easy to type Easy to parse UTF-8 only Native to web browsers Works in the ABL

(Representational state transfer) REST REST  (Representational state transfer) A software architecture style consisting of guidelines and best practices for creating scalable web services - wikipedia Easy to type Easy to parse UTF-8 only Native to web browsers Works in the ABL

REST – Formalized best practices REST is a set of best practices Formally specified back in 2000 Service architecture, not implementation Swagger.io provides a nice way to document your API JSONAPI Used to resolve arguments 2000 by Roy Fielding  Alternative to soap – just a set of best practices Boiled down to just a few for this demo

REST – Officially Client-server architecture Stateless Cacheable Layered On demand Unified interface

(usually) communicate using HTTP REST – Usually (usually) communicate using HTTP (usually) make sure of standard HTTP GET, PUT, POST, DELETE (and others) verbs. (usually) uses JSON and sometimes XML (usually) easy to load balance (usually) uses URIs as resource identifiers (usually) HTTP status codes to indicate success or failure Normally URIs (URLs) are used on the web. You could come up with your own scheme

REST - The Verbs GET – Get something. Typically a single resource, or a set of resources. May have some filtering POST – Create something. Typically this create a new resource inside an existing collection. PUT – Update something. Resource should already exist. DELETE – Remove something. Resource should already exist.

REST – running something PUT – Update something. Update the state of something to “running” or “executing’. Use the URL to dictate what gets run. In OEM issugin a PUT to a URL with a simple JSON object with a property of “running” = “true” indicates start or stop the service

REST – The Nouns GET http://server:8080/rest/customers/ Retrieve the list of customers GET http://server:8080/rest/customers?q={ “id” : { “lt” : “100”} Retrieve a list of filtered customers GET http://server:8080/rest/customers/1 Get a single customer object POST http://server:8080/rest/customers/ Create a new customer PUT http://server:8080/rest/customers/1974 Update an existing customer DELETE http://server:8080/rest/customers/1974 Delete a customer URLs should use nouns. Verbs are what you are doing to them

Why REST?

Because it is not SOAP! REST – not SOAP Soap became too complicated. It doesn’t work well with web browsers

REST - The Internet runs on REST

REST – everyone’s doing it World Region Population (est. 2014) Internet Users (est.) % Africa 1,125,721,038 297,885,898 26.5 Asia 3,996,408,007 1,386,188,112 34.7 Europe 825,824,883 582,441,059 70.5 Middle East 231,588,580 111,809,510 48.3 North America 353,860,227 310,322,257 87.7 Latin America 612,279,181 320,312,562 52.3 Oceana 36,724,649 26,789,942 72.9 Total 7,182,406,565 3,035,749,340 42.3 Soap became too complicated. It doesn’t work well with web browsers

REST –someone else’s API Google API http://code.google.com/more/ Facebook API https://developers.facebook.com/ Twitter API https://dev.twitter.com/docs Amazon API https://affiliate-program.amazon.com/gp/advertising/api/detail/main.html Salesforce API http://www.salesforce.com/us/developer/docs/api/index.htm YouTube API http://code.google.com/apis/youtube/overview.html WordPress API http://codex.wordpress.org/WordPress_APIs Flickr API http://www.flickr.com/services/developer/ Dropbox API http://www.dropbox.com/developers

JSON

JSON – Not this one Easy to type Easy to parse UTF-8 only Native to web browsers Works in the ABL

(JavaScript Object Notation) JSON JSON  (JavaScript Object Notation) a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate. It is based on a subset of the JavaScript programming language - json.org Easy to type Easy to parse UTF-8 only Native to web browsers Works in the ABL

Lingua Franca JSON lin·gua fran·ca /ˌliNGɡwə ˈfraNGkə/ a language that is adopted as a common language between speakers whose native languages are different. - google.com Easy to type Easy to parse UTF-8 only Native to web browsers Works in the ABL

JSON – looks like this {"menu": { "id": "file", "value": "File", "popup": { "menuitem": [ {"value": "New", "onclick": "CreateNewDoc()“}, {"value": "Open", "onclick": "OpenDoc()"}, {"value": "Close", "onclick": "CloseDoc()"} ] } it IS javascript Start with an object tags – squigglies Has name value pairs separated by colons since it uses object initializer syntax The colors aren’t necessary Properties and string values are quoted Only 5 data types object, array, string, number, boolean Dates are iso8601 format Always serialized as UTF-8 – extremely compatible

JSON – similar to XML <menu id="file" value="File"> <popup> <menuitem value="New" onclick="CreateNewDoc()" /> <menuitem value="Open" onclick="OpenDoc()" /> <menuitem value="Close" onclick="CloseDoc()" /> </popup> </menu>

JSON – beats XML

ABL

REST – Join the crowd ABL Language: 10.2B introduced JSON for temp-tables Supported directly in temp-tables ABL OO: 11.0 introduced JsonObject + JsonArray Full OO implementation for creating JSON documents and serialization Server side: 11.2 introduced OpenEdge Web Server (REST Adapter) Provides REST out support for clients accessing OpenEdge AppServer Java servlet application Design the service with PDSOE Nice for with OpenEdge Mobile + JSDO Client side: 11.5.1 introduces OpenEdge.Net.HTTP Full HTTP Client written in 100% ABL Direct supports JSON and XML payloads Yes, the library works fine as far back as 10.2B Yes

JSON – Loading from LongChar define variable myLongchar as longchar no-undo init "". define variable myParser as Progress.Json.ObjectModel.ObjectModelParser no-undo. define variable Request as Progress.Json.ObjectModel.JsonConstruct no-undo. fix-codepage(myLongchar) = "utf-8". copy-lob from file "ttCust.json" to mylongchar. myParser = new Progress.Json.ObjectModel.ObjectModelParser(). Request = myParser:Parse(myLongchar). define temp-table ttCust like Customer. temp-table ttCust:read-json("JsonObject", Request, "empty").

JSON – Write a temp-table to a file define temp-table ttCust no-undo like Customer. for each Customer where Customer.CustNum < 100: buffer-copy Customer to ttcust. end. temp-table ttCust:WRITE-JSON("file", "ttCustom.json", true).

JSON – Using HTTP client to retrieve a web page using OpenEdge.Net.HTTP.*. define variable oClient as IHttpClient. define variable oRequest as IHttpRequest. define variable oResponse as IHttpResponse. oClient = ClientBuilder:Build():Client. oRequest = RequestBuilder:Get('https://www.progress.com'):Request. oResponse = oClient:Execute(oRequest). message oResponse:StatusCode skip oResponse:StatusReason view-as alert-box.

JSON – Using HTTP client to PUT some data oClient = ClientBuilder:Build():Client. entity = new JsonObject(). entity:Add(“some", “data”). creds = new Credentials(“user”, “password”). oRequest = RequestBuilder:put(url, entity): UsingBasicAuthentication(creds): Request. oResponse = oClient:Execute(oRequest).

WebSpeed

WebSpeed + REST – Why? Because I can I like WebSpeed Convenient WebSpeed needs some love Because you need a service on the Internet You might not want to deal with REST Adapter Because you want to use Kendo Charts REST + JSON fits fairly well with existing WebSpeed applications Stateless Can run any ABL code – including the new HTTPClient Can stream any form of data back to the caller

WebSpeed – for each customer: display customer. Create a .html file or cgi-wrapper Add some SpeedScript Compile that to r-code Deploy that out to the WebSpeed agent PROPATH Open a web browser with a URL something like: http://localhost/cgi-bin/cgiip.exe/WService=wsbroker1/ui/weather.p Data access through some other .p, building all the HTML in the agent Images and .css and javascript are all stored on the web server

WebSpeed – separation of concerns Create a .html file Create a .js file that can execute an XHR request Create a REST API service .p Use temp-tables or JsonObject Define URI pattern Compile that to r-code Deploy the .html file and .js to the web server Deploy the .p to the WebSpeed agent PROPATH REST Service Problem with WebSpeed model is separation of concerns. If you write speedscript you have violated separation of UI and data. JSON + REST can help you split this.

WebSpeed – Use the WEBSTREAM define input parameter webstream as handle no-undo. define temp-table ttCust no-undo like Customer. for each Customer where Customer.CustNum < 100: buffer-copy Customer to ttcust. end. temp-table ttCust:write-json("stream-handle", webstream:handle ).

openweathermap.org – current weather

WebSpeed – temp-tables as JSON

Technique - dispatch your own URI This works http://<host>/cgi-bin/cgiip.exe/rest/customers.p?custid=1 This is much better http://<host>/cgi-bin/cgiip.exe/rest/customers/1

Technique – how to dispatch http://<host>/rest/{entity}/{collection}/{resource} http://<host>/rest/{entity}/{collection}?<query syntax> Copy and modify web-disp.p to detect REST if PATH_INFO begins “REST” then Use the ABL MATCHES function Or write your own..whatever…its your implementation if PATH_INFO matches “/rest/customer/customers/*” then run <businessentity>.p (input …) This is what rest adapter does for you based on .pidl file generated out of PDSOE.

How it is done

WebSpeed – incomplete match for REST Messenger only supports GET and POST DELETE has no parallel – left as an exercise for the reader Talk to your product manager to get this fixed Use the REST Adapter instead PUT can almost always be mapped to POST URIs in WebSpeed are the name of the program Have to dispatch your own requests Use REST Adapter + AppServer if you want declarative dispatching There is no framework to handle the dispatching for you PASOE is supposed to fix this stuff – Go see Banks and Cleary’s talk on WebSpeed new Object Model

ABL + REST + JSON – The easy parts Retrieving and calling REST services Loading data into dataset or temp-tables – but only if data is simple Creating new JSON objects in memory and writing them to streams Temp-tables map exactly to what kendo expects for charts and basic grids Changing property names in temp-table done through serialize-name REST adapter works nice if you have AppServer

ABL + REST + JSON – The hard parts Incoming data doesn’t map directly to dataset or temp-table You have to hand write the code to convert the JSON structure Reorganizing complex data may take a lot of work if the format is very different Outgoing data doesn’t map directly to dataset or temp-table You have to match what the API to what your caller expects Arrays of objects that have nested objects cannot be mapped to temp-table or dataset You cannot serialize to<->from ABL objects No support in current version to read or write to ABL objects ABL object serialization only works with AppServer JSON objects do not have to be equivalent Temp-tables are “flat” in that all rows have the same properties REST adapter for AppServer takes a lot more setup

REST – someone else’s opinion http://martinfowler.com/articles/enterpriseREST.html http://jsonapi.org/format/ http://swagger.io http://en.wikipedia.org/wiki/Representational_state_transfer

What I’ve learned

What I’ve learned – its for you Make it friendly to developers Don’t try to make one API do too much Document it so someone can find it later It might also be for someone else Be aware of what your API might grow into

What I’ve learned – Errors Encode errors the same as your messages Encode messages as JSON if you are using JSON { "code" : 1234, "message" : "Something bad happened :(", "description" : "More details about the error here" }

What I’ve learned – URLs URLs are nouns and identifiers Prefer plural nouns Don’t nest your API too deep Its not a menu The URLs should make sense Use this /cars Don’t do this /items/large/type/3

What I’ve learned – get some tools For someone else’s API Use POSTMAN Chrome plugin Browser debugger – not everyone documents every field Find an Eclipse plugin Fiddler - to inspect raw HTTP connection For your API Document it

What I’ve learned – filtering, paging Filtering on the query, not the path Use this /cars?color=red Don’t do this /cars/red/ Don’t be afraid to alias common or difficult queries /queries/MultiTenantConvertableTables Paging You are going to need server side paging Different UI toolkits have different requirements for identifying paging attributes

What I’ve learned – security Use SSL! REST is supposed to be stateless But that isn’t always practical HTTP Basic OAuth

What I’ve learned – Caching Be aware it exists, especially on the internet Etag isn’t as simple as it sounds Records need a unique id and a modification stamp Or a hash

Q&A mbaker@progress.com

This template makes my eyes hurt.

Please turn the lights back on.