View
215
Download
1
Category
Tags:
Preview:
Citation preview
SE 370: Programming Web Services
Week 11: JSON & RESTfulCopyright © Steven W. Johnson
February 1, 2013
asdf
Today:
2
REST uses JSON to transmit data
JSON:
3
JavaScript Object Notation
Douglas Crockford (2002)
JSON: text-based, open data interchange system
JSON:
4
Purpose:
data interchange (kavşak) format
serialize data for network transmission
passes objects as strings from server to client
Intention: a light-weight alternative to XML
Incorporated into ISO
Part of ECMAScript, RFC 4627
JSON:
5
M. C. Escher: (1898 – 1972)
JSON:
6
Basic format of JSON:
all data held in square brackets
each record held in curly brackets
field is made up of:
field name in quotes
value written appropriate to its data type
name/value pairs delimited by commas
JSON:
7
[ {“name”: value, “name”: “value”}, {“name”: value, “name”: “value”} ]
JSON formatting options:
JSON:
8http://www.json.org/
Ajax format for JSON
employees = [{"firstName":"John", "lastName":"Doe", "age":"18"},{"firstName":"Peter", "lastName":"Jones", "age":"21"}];
REST:
each record in curly brackets
all records in square brackets
JSON:
9http://www.json.org/
0 1 2 3
0 [0,0] [0,1] [0,2] [0,3]
1 [1,0] [1,1] [1,2] [1,3]
2 [2,0] [2,1] [2,2] [2,3]
array[2][1]; //9array[1][3]; //7
array = [{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}];
Each represents the same data; “records”
Effectively a database table
JSON:
10
students = [ {“name”:“Ali”, “age”:”20”, “bolum”:“MBBF” }, {“name”:“Bahar”, “age”:”21”, “bolum”:“ITF” }]; Students
Name Age Bolum Gender
Ali 20 MBBF Erkek
Bahar 21 ITF Hanim
students[1].age //21
An array of arrays or a database with 2 tables
‘Company’ is DB, tables ‘employees’, ‘managers’
JSON:
11
var company = {“employees”: [ { "firstName":"John" , "lastName":"Doe" , "age":"18"}, { "firstName":"Anna" , "lastName":"Smith" , "age":"20"}, { "firstName":"Peter" , "lastName":"Jones" , "age":"21"} ], “managers”: [ { "firstName":"Alice" , "lastName":“Williams" , "age":"19"}, { "firstName":"Carla" , "lastName":“Walker" , "age":"23"}, { "firstName":"Joe" , "lastName":“Evans" , "age":"22"} ]}
document.write(company.employees[2].firstName); //Peterdocument.write(company.managers[1].age); //23
Update table values also
JSON:
12
var company = {“employees”: [ { "firstName":"John" , "lastName":"Doe" , "age":"18"}, { "firstName":"Anna" , "lastName":"Smith" , "age":"20"}, { "firstName":"Peter" , "lastName":"Jones" , "age":"21"} ], “managers”: [ { "firstName":“Alice" , "lastName":“Williams" , "age":"19"}, { "firstName":“Carla" , "lastName":“Walker" , "age":"23"}, { "firstName":“Joe" , "lastName":“Evans" , "age":"22"} ]}
company.employees[2].firstName= “Steve”;
x-dimensional array saved as ‘employees’
objname[i]fieldname:
JSON:
13
employees = [{ "firstName":"John" , "lastName":"Doe" , "age":18},{ "firstName":"Anna" , "lastName":"Smith" , "age":20},{ "firstName":"Peter" , "lastName":"Jones" , "age":21}];
document.write(employees[1].age); //20
JSON supports UTF-8; Notepad doesn’t
Must save UTF-8 files using UTF-8, not ANSI
JSON:
14
Derived from JavaScript to represent objects:
simple data structures
associative arrays
parsers available for many languages
JSON:
15
JSON versus XML:
JSON:
16
“students”= [ {“name”: “Ali”, “age”: “20”, “bolum”: “MBBF”}, {“name”: “Bahar”, “age”: “21”, “bolum”: “ITF”}]
<?xml version=“1.0” encoding=“utf-8”?>
<students> <student> <name>Ali</name> <age>20</age> <bolum>MBBF</bolum> <gender>Erkek</gender> </student> <student> <name>Bahar</name> <age>21</age> <bolum>ITF</bolum> <gender>Hanim</gender> </student> </students>
JSON:
MIME type: application/json
Extension: .json
Basic form: uses name/value pairs
JSON can be stored in either .json and .txt
17
{“firstname”: “Canan”}
firstname = “Canan”;
¸
data.txtdata.json
JSON is JavaScript
‘XML’ with anorexia; faster to parse*
Easier to write, lightweight, less verbose
True data format, not a meta language
JSON advantages:
18
<name>Steve</name>
“name”: “Steve”,
True for both XML and JSON:
language independent
cross-platform
self-describing
human readable
hierarchical (data in data, values describing values)
JSON similarities:
19
JSON is JavaScript
Requires use of ‘eval’ function*
Reserved JavaScript keywords can’t be used as
element names
XML is more familiar, more like HTML
XML more precise due to specific DTD
XML has better support
JSON disadvantages:
20
Data types of JSON: (just like JavaScript)
number (JavaScript has no ‘float’ and
‘integer’)
string
Boolean
array
object
null
JSON:
21
Both describe objects as strings
Both are suitable for use in web services
Both enjoy broad support, libraries, etc
Tools exist to convert
Data conversion can easily be done manually
JSON versus XML:
22
<name>Steve</name>
“name”: “Steve”,
JSON:
23
<name>Ali</name>
a=indexOf("<") d=lastIndexOf("<")
b=indexOf(">") c=lastIndexOf("<")
"name"=substr(a+1,b-1)
"Ali"=substring(b+1,c)
"</"+name+">"
Convert XML to JSON:
String.substr (start, # of characters);String.substring(start, finish);
JSON:
24
<name>Ali</name>
a=indexOf("<") d=lastIndexOf("<")
b=indexOf(">") c=lastIndexOf("<")
"name"=substr(a+1,b-1)
"Ali"=substring(b+1,c)
document.write(name, value);
Convert XML to JSON:
JSON:
25
<firstname>Ali</firstname><lastname>Zeybek</lastname><age>23</age>for (i=0; i<length; i++) { name = String.substr(a+1,b-1) value = String.substring(b+1,c) document.write(name, value);}
Convert XML to JSON:
for (i=0; i<length; i++) { name = String[i].substr(a+1,b-1) value = String[i].substring(b+1,c) document.write("\""+name+"\": \""+value+"\", ");}
Lab: JSON Parser
26
<CustomerNumber>7458</CustomerNumber><FirstName>Elif</FirstName><Surname>Bardukoglu</Surname><Discount>5</Discount>
Convert XML to name/value pairs
Output: “CustomerNumber”: “3568”,
Assume data held in single string ‘data’
<Cust>123</Cust> <First>Ali</First>
Data= “<CustomerNumber>7458</CustomerNumber> <FirstName>Elif</FirstName> <Surname>Bardukoglu</Surname> <Discount>5</Discount>”;
Lab: JSON Parser
27
<script>data = "<CustomerNumber>7458</CustomerNumber> <FirstName>Elif</FirstName> <Surname>Bardukoglu</Surname> <Discount>5</Discount>";
var rawdata = data.split(" ");count = rawdata.length;for (i=0; i<count; i++) { namestart = rawdata[i].indexOf("<");
nameend = rawdata[i].indexOf(">");nametext = rawdata[i].substring(namestart + 1, nameend);valuestart = nameend;valueend = rawdata[i].lastIndexOf("<");valuetext = rawdata[i].substring(valuestart + 1, valueend);document.write("\""+nametext+"\": \""+valuetext+"\"");if (i < count-1) document.write(", ");
}</script>
Break 28
Lab: JSON Parser
29
Convert JSON to XML:
<students> <student> <name>Ali</name> <age>20</age> <bolum>MBBF</bolum> </student> <student> <name>Bahar</name> <age>21</age> <bolum>ITF</bolum> </student></students>
student=[ {"name":"Ali","age":"20","bolum":"MBBF"}, {"name":"Bahar","age":"21","bolum":"ITF"}];
Lab: JSON Parser
30
student=[ {"name":"Ali","age":"20","bolum":"MBBF"}, {"name":"Bahar","age":"21","bolum":"ITF"}];
Convert JSON to XML:
Root element is ‘students’ (not considered)
‘Students’ is root element
Text before “=” is like record name
Rows are like records; holds field names, values
Lab: JSON Parser
31
Convert JSON to XML: (format is different)
Assume no spaces in the ‘data’
<students> <student> <name>Ali</name> <age>20</age> <bolum>MBBF</bolum> </student> <student> <name>Bahar</name> <age>21</age> <bolum>ITF</bolum> </student></students>
student=[{"name":"Ali","age":"20","bolum":"MBBF"},{"name":"Bahar","age":"21","bolum":"ITF"}];
Lab: JSON Parser
32
Convert JSON to XML: (format is different)
student=[{"name":"Ali","age":"20","bolum":"MBBF"},{"name":"Bahar","age":"21","bolum":"ITF"}];
indexOf(“\””)
lastIndexOf(“\””)
replace(“\”,\””, “ “)
replace(“\“:\””, “ “)
name Ali age 20 bolum MBBF"},{"name Bahar age 21 bolum ITF
split(“ ”)
Quiz:
1. What is the address of the value 24?
33
12 16 175 8 123 24 6
[2, 1]
Quiz:
2. Place this array in the table:
34
1 2 34 5 67 8 9
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Quiz:
3. What XML tag is most like a record?
35
<bbb>
<aaa> <bbb> <ccc>data</ccc> <ccc>data</ccc> <ccc>data</ccc> </bbb></aaa>
Quiz:
4. From <aaa>, the address of <bbb>?
5. Child nodes of <ccc>
6. What is the root node?
36
<aaa>[0].childNodes[0]
<aaa> <bbb> <ccc>11</ccc> <ccc>22</ccc> <ccc>33</ccc> </bbb></aaa>
0
<aaa>
Quiz:
7. Children of <aaa>?
8. Value of <bbb>[0].childNodes[1].childNodes[0].nodeValue
37
1
<aaa> <bbb> <ccc>11</ccc> <ccc>22</ccc> <ccc>33</ccc> </bbb></aaa>
22
Quiz:
9. JSON array of 3 names:
38
friends = [ {“name”:”Ali”, “name”:”Bahar”, “name”:”Canan”}];
Quiz:
10. What is the value of company.employees[1].age?
39
var company = {“employees”: [ { "firstName":"John" , "lastName":"Doe" , "age":18}, { "firstName":"Anna" , "lastName":"Smith" , "age":20}, { "firstName":"Peter" , "lastName":"Jones" , "age":21} ], “managers”: [ { "firstName":“Alice" , "lastName":“Williams" , "age":19}, { "firstName":“Carla" , "lastName":“Walker" , "age":23}, { "firstName":“Joe" , "lastName":“Evans" , "age":22} ]}
20
SE 370: Programming Web Services
Week 12: JSONCopyright © Steven W. Johnson
February 1, 2013
asd
asd
asd
Today:
41
Labs:
Assignment:
Week 2:
42
asd
Course textbook:
43
Break 44
Labs:
Assignment:
Week 2:
45
Deploy (rt. Click on project – Deploy)
http://localhost:8080/HelloTest/webresources/generic
Lab: Hello RESTful Webapps
46
REST:
GET/POST/PUT/DELETE methods of HTTP
Requires tomcat
Made in maven
RESTEasy
NetBeans
https://netbeans.org/kb/docs/websvc/intro-ws.html
http://yiyujia.blogspot.com/2011/09/simple-tutorial-about-creating-jersey.html***
47
Customers in table:
Lab: Web Service using REST
48
@Stateless@Path("customerdb.customer")public class CustomerFacadeREST extends AbstractFacade<Customer> { @PersistenceContext(unitName = "CustomerDBPU") private EntityManager em;
public CustomerFacadeREST() { super(Customer.class); }
@POST @Override @Consumes({"application/xml", "application/json"}) public void create(Customer entity) { super.create(entity); }
@PUT @Override @Consumes({"application/xml", "application/json"}) public void edit(Customer entity) { super.edit(entity); }
@DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); }
@GET @Path("{id}") @Produces({"application/xml", "application/json"}) public Customer find(@PathParam("id") Integer id) { return super.find(id); }
@GET @Override @Produces({"application/xml", "application/json"}) public List<Customer> findAll() { return super.findAll(); }
@GET @Path("{from}/{to}") @Produces({"application/xml", "application/json"}) public List<Customer> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); }
@GET @Path("count") @Produces("text/plain") public String countREST() { return String.valueOf(super.count()); }
@Override protected EntityManager getEntityManager() { return em; } }
Customers in table:
Lab: Web Service using REST
49
@Stateless@Path("customerdb.customer")public class CustomerFacadeREST extends AbstractFacade<Customer> { @PersistenceContext(unitName = "CustomerDBPU") private EntityManager em;
public CustomerFacadeREST() { super(Customer.class); }
@POST @Override @Consumes({"application/xml", "application/json"}) public void create(Customer entity) { super.create(entity); }
@PUT @Override @Consumes({"application/xml", "application/json"}) public void edit(Customer entity) { super.edit(entity); }
@DELETE @Path("{id}") public void remove(@PathParam("id") Integer id) { super.remove(super.find(id)); }
@GET @Path("{id}") @Produces({"application/xml", "application/json"}) public Customer find(@PathParam("id") Integer id) { return super.find(id); }
@GET @Override @Produces({"application/xml", "application/json"}) public List<Customer> findAll() { return super.findAll(); }
@GET @Path("{from}/{to}") @Produces({"application/xml", "application/json"}) public List<Customer> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) { return super.findRange(new int[]{from, to}); }
@GET @Path("count") @Produces("text/plain") public String countREST() { return String.valueOf(super.count()); }
@Override protected EntityManager getEntityManager() { return em; } }
Create record 14 as yourself
Lab: Web Service using REST
50
<?xml version="1.0" encoding="UTF-8"?> <customers> <customer> <addressline1>111 E. Las Olivas Blvd</addressline1> <addressline2>Suite 51</addressline2> <city>Fort Lauderdale</city> <creditLimit>100000</creditLimit> <customerId>1</customerId> <discountCode> <discountCode>78</discountCode> <rate>0.00</rate> </discountCode> <email>jumboeagle@example.com</email> <fax>305-555-0189</fax> <name>Jumbo Eagle Corp</name> <phone>305-555-0188</phone> <state>FL</state> </customer>
<?xml version="1.0" encoding="UTF-8"?> <customers> <customer> <addressline1>6482 Sokak #33/1</addressline1> <addressline2>Suite 51</addressline2> <city>Fort Lauderdale</city> <creditLimit>100000</creditLimit> <customerId>14</customerId> <discountCode> <discountCode>75</discountCode> <rate>0.00</rate> </discountCode> <email>steve.johnson@gmail.com</email> <fax>305-555-0189</fax> <name>Jumbo Eagle Corp</name> <phone>305-555-0188</phone> <state>FL</state> </customer>
{"discountCode":"H","rate":16.00,"customerCollection":[{"customerId":36,"name":"Bob Hosting Corp.","addressline1":"65653 Lake Road","addressline2":"Suite 2323","city":"San Mateo","state":"CA","phone":"650-555-0160","fax":"650-555-0161","email":"www.bobhostcorp.example.com","creditLimit":65000,"discountCode":
Create the client application:
File – New Project
Lab: Web Service using REST
51
Uncheck ‘Create Main Class’ – Finish
Lab: Web Service using REST
52
Rt. Click Project – New – Entity Classes from Database
Lab: Web Service using REST
53
Add package name - Finish
Lab: Web Service using REST
54
Rt. Click on client project
New – Other… - Web Services – RESTful Java Client
Lab: Web Service using REST
55
Create the client application:
File – New Project
Lab: Web Service using REST
56
SE 370: Programming Web Services
Week 12: JSONCopyright © Steven W. Johnson
February 1, 2013
Use CRON to run the client page
Asadmin in glassfish-3.1.2.2 – bin
http://www.javascool.com/2010/04/15/ejb-timer-service/
Lab: CRONentry
58
rs.next();int id=921;String customernumber = "ABCD";String sku = rs.getString("sku");int qtyordered = rs.getInt("maxstock") - rs.getInt("onhand");
Open ‘Projects’ tab – File – New Project - Java
Lab: CRONentry
59
Name: OrderWS (all server side is ‘order’)
Main Class: DBConnect
Lab: CRONentry
60
Lab: CRONentry
61
Gives a class DBConnect/* * To change this template, choose Tools | Templates * and open the template in the editor. */package orderws;
/** * * @author Steve */public class DBConnect {
/** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here }}
Lab: CRONentry
62
Connection to DB requires imports:
unused import (will be used later)
package orderws;
import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;
public class DBConnect {
/** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here }}
Set up the connection string:
Error: ‘unreported exception’ (add try/catch: coming)
Lab: CRONentry
63
package orderws;
import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;
public class DBConnect {
/** * @param args the command line arguments */ public static void main(String[] args) { String host = “jdbc:derby://localhost:1527/order”; String user = “stevej” String pass = “izmir” Connection con = DriverManager.getConnection(host, user, pass); }}
Add try/catch framework:
Lab: CRONentry
64
public static void main(String[] args) { try { String host = “jdbc:derby://localhost:1527/order”; String user = “stevej” String pass = “izmir” Connection con = DriverManager.getConnection(host, user, pass); } catch (SQLException err) { System.out.println(err.getMessage());}
Add two imports to top
These are used to create the query and recordset
Lab: CRONentry
65
import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.Statement;//import java.sql.ResultSet;
Create INSERT query
As written, works on single INSERT only
Dummy data added to test format
Lab: CRONentry
66
Statement stmt = con.createStatement();
int id = 12;String customernumber = "Server";String sku = "428575 87412";int qtyordered = 9;
String SQL = "INSERT INTO orderentry VALUES ("+id+", '"+customernumber+"', '"+sku+"', "+qtyordered+")";stmt.executeUpdate(SQL);System.out.println("Successful Execution");
http://www.vogella.com/articles/REST/article.html
http://java.dzone.com/news/simple-restful-web-services
http://java.dzone.com/articles/easy-way-expose-java-service
http://firstinfinity.wordpress.com/modeling_rest_web_services/**
http://rathinasaba.wordpress.com/2010/09/05/restful-web-service-sample-in-tomcat/
http://docs.oracle.com/cd/E21764_01/web.1111/e13734/rest.htm
http://docs.oracle.com/cd/E19798-01/821-1841/giepu/index.html
http://docs.oracle.com/javaee/6/tutorial/doc/gipzz.html
Today:
67
Jersey
Restlet
JBoss RESTEasy
Apache CXF
Triaxrs
Apache Wink
eXo
Implementations of REST
68
Create the client application:
File – New Project
Lab: Web Service using REST
69
Create the client application:
File – New Project
Lab: Web Service using REST
70
Create the client application:
File – New Project
Lab: Web Service using REST
71
Create the client application:
File – New Project
Lab: Web Service using REST
72
REST:
REST architecture describes six constraints:
client/server model; separation of concerns
Stateless: no memory of prior communications
Cacheable
Layered system: may use intermediary servers
Code on demand (optional)
Uniform interface (wikipedia)
https://en.wikipedia.org/wiki/Representational_state_transfer73
DiscountCode.java
Lab: Client side of REST
74
DiscountCode.java
Lab: Client side of REST
75
http://www.oracle.com/technetwork/articles/javase/index-137171.html
http://www.myeclipseide.com/documentation/quickstarts/webservices_rest/
http://rest.elkstein.org/
http://docs.oracle.com/javaee/6/tutorial/doc/giepu.html
http://www.packtpub.com/restful-php-web-services/book
http://davidwalsh.name/web-service-php-mysql-xml-json
http://www.ibm.com/developerworks/opensource/tutorials/os-php-webservice/
http://publib.boulder.ibm.com/infocenter/wmbhelp/v7r0m0/index.jsp?topic=%2Fcom.ibm.etools.mft.samples.jsonrest.doc%2Fdoc%2Fintroduction.htm
Today:
76
RESTful PHP Web Services’, http://www.packtpub.com/restful-php-web-services/book
http://www.slideshare.net/jeremycod/consuming-restful-web-services-in-php
Today:
77
http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/
http://www.javaworld.com/javaworld/jw-01-2013/130124-web-services-are-dead-long-live-rest.htmlasd
http://www.ibm.com/developerworks/web/library/wa-aj-tomcat/
http://drupal.org/node/1860564
http://code.google.com/p/staff/wiki/ExampleCalculatorService
https://access.redhat.com/site/documentation/en-US/JBoss_Developer_Studio/4.0/html/JBoss_Web_Services_User_Guide/sample_web_service_wizards-sample_restful_web_service
.html
RESTEasy installed
http://community.jaspersoft.com/wiki/getting-started-rest-web-service-api**
http://www.9lessons.info/2012/05/create-restful-services-api-in-php.html PHP
http://markroland.com/blog/restful-php-api/
http://phpmaster.com/writing-a-restful-web-service-with-slim/
http://www.xfront.com/REST-Web-Services.html
Today:
78
asd
asd
asd
Today:
79
Recommended