SlideShare a Scribd company logo
1 of 166
Download to read offline
andyjpb@knodium.com 
@databasescaling 
Thursday, 25th September 2014 
2014/09/24 APIconUK 2014 1 / 149
HTTP APIs As First Class Procedures 
a@kno.dm 
@databasescaling 
Thursday, 25th September 2014 
2014/09/24 APIconUK 2014 2 / 149
HTTP APIs As First Class Procedures 
Cutting out SDK Complexity 
a@kno.dm 
@databasescaling 
Thursday, 25th September 2014 
2014/09/24 APIconUK 2014 3 / 149
andyjpb 
http://www.obsoletecomputermuseum.org/oliv_m24/m24.jpg 
2014/09/24 APIconUK 2014 4 / 149
GSM AT Command Set 
cmd AT+CREG "Network Registration (ver.2)" 
set AT+CREG=[<creg_stat>],<creg_urc>,<ci> 
read AT+CREG? 
+CREG:<creg_urc>,<creg_stat>[,<lac>,<ci>] 
test AT+CREG=? 
+CREG 
2014/09/24 APIconUK 2014 5 / 149
GSM AT Command Set 
cmd AT+CREG "Network Registration (ver.2)" 
set AT+CREG=[<creg_stat>],<creg_urc>,<ci> 
read AT+CREG? 
+CREG:<creg_urc>,<creg_stat>[,<lac>,<ci>] 
test AT+CREG=? 
+CREG 
2014/09/24 APIconUK 2014 6 / 149
GSM AT Command Set 
cmd AT+CREG "Network Registration (ver.2)" 
set AT+CREG=[<creg_stat>],<creg_urc>,<ci> 
read AT+CREG? 
+CREG:<creg_urc>,<creg_stat>[,<lac>,<ci>] 
test AT+CREG=? 
+CREG 
2014/09/24 APIconUK 2014 7 / 149
GSM AT Command Set 
cmd AT+CREG "Network Registration (ver.2)" 
set AT+CREG=[<creg_stat>],<creg_urc>,<ci> 
read AT+CREG? 
+CREG:<creg_urc>,<creg_stat>[,<lac>,<ci>] 
test AT+CREG=? 
+CREG 
2014/09/24 APIconUK 2014 8 / 149
GSM AT Command Set 
cmd AT+CREG "Network Registration (ver.2)" 
set AT+CREG=[<creg_stat>],<creg_urc>,<ci> 
read AT+CREG? 
+CREG:<creg_urc>,<creg_stat>[,<lac>,<ci>] 
test AT+CREG=? 
+CREG 
2014/09/24 APIconUK 2014 9 / 149
GSM AT Command Set 
cmd AT+CREG "Network Registration (ver.2)" 
set AT+CREG=[<creg_stat>],<creg_urc>,<ci> 
read AT+CREG? 
+CREG:<creg_urc>,<creg_stat>[,<lac>,<ci>] 
test AT+CREG=? 
+CREG 
int AT_CREG_test(int port, struct AT_result* result) { 
int r = 0; 
if ((r = sendcmd(port, "AT+CREG=?", result))) return r; 
return recvresp(port, result); 
} 
2014/09/24 APIconUK 2014 10 / 149
Execution Tracing 
DBrow *CursorNext(DB *env, DBcursor* cursor, DBresult* result) { 
/* Increment the cursor to the next row in the direction 
* that the cursor is travelling and return the row to 
* the caller. 
*/ 
... 
} 
2014/09/24 APIconUK 2014 11 / 149
Execution Tracing 
DBrow *CursorNext(DB *env, DBcursor* cursor, DBresult* result); 
2014/09/24 APIconUK 2014 12 / 149
Execution Tracing 
DBrow *CursorNext(DB *env, DBcursor* cursor, DBresult* result); 
2014/09/24 APIconUK 2014 13 / 149
Execution Tracing 
DBrow *CursorNext(DB *env, DBcursor* cursor, DBresult* result); 
2014/09/24 APIconUK 2014 14 / 149
Execution Tracing 
DBrow *CursorNext(DB *env, DBcursor* cursor, DBresult* result) { 
DBrow *(*original_proc)(DB*, DBcursor*, DBresult*); 
DBrow *original_result; 
log(“Entering CursorNext”); 
DB_serialise(env); 
Cursor_serialise(cursor); 
Result_serialise(result); 
original_proc = dlsym(RTLD_NEXT, “CursorNext”); 
original_result = (*original_proc)(env, cursor, result); 
DB_serialise(env); 
Cursor_serialise(cursor); 
Result_serialise(result); 
Log(“Leaving CursorNext”); 
return (original_result); 
} 
2014/09/24 APIconUK 2014 15 / 149
Execution Tracing 
DBrow *CursorNext(DB *env, DBcursor* cursor, DBresult* result) { 
DBrow *(*original_proc)(DB*, DBcursor*, DBresult*); 
DBrow *original_result; 
log(“Entering CursorNext”); 
DB_serialise(env); 
Cursor_serialise(cursor); 
Result_serialise(result); 
original_proc = dlsym(RTLD_NEXT, “CursorNext”); 
original_result = (*original_proc)(env, cursor, result); 
DB_serialise(env); 
Cursor_serialise(cursor); 
Result_serialise(result); 
Log(“Leaving CursorNext”); 
return (original_result); 
} 
2014/09/24 APIconUK 2014 16 / 149
Execution Tracing 
DBrow *CursorNext(DB *env, DBcursor* cursor, DBresult* result) { 
DBrow *(*original_proc)(DB*, DBcursor*, DBresult*); 
DBrow *original_result; 
log(“Entering CursorNext”); 
DB_serialise(env); 
Cursor_serialise(cursor); 
Result_serialise(result); 
original_proc = dlsym(RTLD_NEXT, “CursorNext”); 
original_result = (*original_proc)(env, cursor, result); 
DB_serialise(env); 
Cursor_serialise(cursor); 
Result_serialise(result); 
Log(“Leaving CursorNext”); 
return (original_result); 
} 
2014/09/24 APIconUK 2014 17 / 149
Execution Tracing 
DBrow *CursorNext(DB *env, DBcursor* cursor, DBresult* result) { 
DBrow *(*original_proc)(DB*, DBcursor*, DBresult*); 
DBrow *original_result; 
log(“Entering CursorNext”); 
DB_serialise(env); 
Cursor_serialise(cursor); 
Result_serialise(result); 
original_proc = dlsym(RTLD_NEXT, “CursorNext”); 
original_result = (*original_proc)(env, cursor, result); 
DB_serialise(env); 
Cursor_serialise(cursor); 
Result_serialise(result); 
Log(“Leaving CursorNext”); 
return (original_result); 
} 
2014/09/24 APIconUK 2014 18 / 149
Execution Tracing 
DBrow *CursorNext(DB *env, DBcursor* cursor, DBresult* result) { 
DBrow *(*original_proc)(DB*, DBcursor*, DBresult*); 
DBrow *original_result; 
log(“Entering CursorNext”); 
DB_serialise(env); 
Cursor_serialise(cursor); 
Result_serialise(result); 
original_proc = dlsym(RTLD_NEXT, “CursorNext”); 
original_result = (*original_proc)(env, cursor, result); 
DB_serialise(env); 
Cursor_serialise(cursor); 
Result_serialise(result); 
Log(“Leaving CursorNext”); 
return (original_result); 
} 
2014/09/24 APIconUK 2014 19 / 149
Knodium 
2014/09/24 APIconUK 2014 20 / 149
Knodium 
2014/09/24 APIconUK 2014 21 / 149
Knodium 
2014/09/24 APIconUK 2014 22 / 149
Knodium 
2014/09/24 APIconUK 2014 23 / 149
Knodium 
2014/09/24 APIconUK 2014 24 / 149
Knodium 
2014/09/24 APIconUK 2014 25 / 149
Knodium 
2014/09/24 APIconUK 2014 26 / 149
Knodium 
2014/09/24 APIconUK 2014 27 / 149
Knodium 
2014/09/24 APIconUK 2014 28 / 149
Knodium 
2014/09/24 APIconUK 2014 29 / 149
Knodium 
2014/09/24 APIconUK 2014 30 / 149
Knodium 
2014/09/24 APIconUK 2014 31 / 149
Knodium 
2014/09/24 APIconUK 2014 32 / 149
Knodium 
2014/09/24 APIconUK 2014 33 / 149
Knodium 
2014/09/24 APIconUK 2014 34 / 149
Knodium 
2014/09/24 APIconUK 2014 35 / 149
Knodium 
2014/09/24 APIconUK 2014 36 / 149
Knodium 
2014/09/24 APIconUK 2014 37 / 149
Knodium 
2014/09/24 APIconUK 2014 38 / 149
Knodium 
2014/09/24 APIconUK 2014 39 / 149
Knodium 
2014/09/24 APIconUK 2014 40 / 149
Knodium 
2014/09/24 APIconUK 2014 41 / 149
Scheme 
2014/09/24 APIconUK 2014 42 / 149
REST 
Read the HTTP spec! 
2014/09/24 APIconUK 2014 43 / 149
REST 
"Finally, I describe the lessons 
learned from applying REST to the 
design of the Hypertext Transfer 
Protocol and Uniform Resource 
Identifier standards, and from their 
subsequent deployment in Web 
client and server software." 
-- Roy Fielding 
2014/09/24 APIconUK 2014 44 / 149
REST 
GET 
Retrieves a representation of the requested 
resource (current state) 
POST 
Create a new instance of a resource 
PUT 
Update an existing instance of a resource 
DELETE 
Remove an existing instance of a resource 
2014/09/24 APIconUK 2014 45 / 149
http://static.squarespace.com/static/518f5d62e4b075248d6a3f90/t/51bb91f3e4b0405092e56e27/1371247103965/not-restful.jpg 
2014/09/24 APIconUK 2014 46 / 149
DCE 
"The Distributed Computing 
Environment (DCE) is a software 
system developed in the early 1990s" 
2014/09/24 APIconUK 2014 47 / 149
DCE/RPC 
"This system allows programmers to 
write distributed software as if it were 
all working on the same computer, 
without having to worry about the 
underlying network code." 
2014/09/24 APIconUK 2014 48 / 149
DCE/RPC 
"This system allows programmers to 
write distributed software as if it were 
all working on the same computer, 
without having to worry about the 
underlying network code." 
2014/09/24 APIconUK 2014 49 / 149
Adhoc Binding 
“I'm looking for a pretty generic, 
fully featured REST client/API in 
python. Not bare bones, but plush, 
nice to use.” 
http://stackoverflow.com/questions/4355997/is-there-a-generic-python-library-to-consume-rest-based-services 
2014/09/24 APIconUK 2014 50 / 149
Adhoc Binding 
“...an HTTP resource kit for Python. It 
allows you to easily access to HTTP 
resource and build objects around it.” 
2014/09/24 APIconUK 2014 51 / 149
Adhoc Binding 
“...an HTTP resource kit for Python. It 
allows you to easily access to HTTP 
resource and build objects around it.” 
“[It] is a full HTTP client using pure 
socket calls and its own HTTP parser.” 
2014/09/24 APIconUK 2014 52 / 149
Adhoc Binding 
api = API('http://myrestful/api/v1') 
# GET /resource 
api.resource.get() 
# GET /resource (with accept header = application/json) 
api.resource.get(format='json') 
# GET /resource?attr=value 
api.resource.get(attr=value) 
# POST /resource 
api.resource.post(attr=value, attr2=value2, ...) 
# GET /resource/id/resource_collection 
api.resoure(id).resource_collection().get() 
2014/09/24 APIconUK 2014 53 / 149
Adhoc Binding 
☺ 
api = API('http://myrestful/api/v1') 
# GET /resource 
api.resource.get() 
# GET /resource (with accept header = application/json) 
api.resource.get(format='json') 
# GET /resource?attr=value 
api.resource.get(attr=value) 
# POST /resource 
api.resource.post(attr=value, attr2=value2, ...) 
# GET /resource/id/resource_collection 
api.resoure(id).resource_collection().get() 
2014/09/24 APIconUK 2014 54 / 149
Adhoc Binding 
☺ 
api = API('http://myrestful/api/v1') 
# GET /resource 
api.resource.get() 
# GET /resource (with accept header = application/json) 
api.resource.get(format='json') 
# GET /resource?attr=value 
api.resource.get(attr=value) 
# POST /resource 
api.resource.post(attr=value, attr2=value2, ...) 
# GET /resource/id/resource_collection 
api.resoure(id).resource_collection().get() 
2014/09/24 APIconUK 2014 55 / 149
Adhoc Binding 
☺ 
api = API('http://myrestful/api/v1') 
# GET /resource 
api.resource.get() 
☹ 
# GET /resource (with accept header = application/json) 
api.resource.get(format='json') 
# GET /resource?attr=value 
api.resource.get(attr=value) 
# POST /resource 
☹ 
api.resource.post(attr=value, attr2=value2, ...) 
# GET /resource/id/resource_collection 
api.resoure(id).resource_collection().get() 
2014/09/24 APIconUK 2014 56 / 149
Adhoc Binding 
☺ 
api = API('http://myrestful/api/v1') 
# GET /resource 
api.resource.get() 
# GET /resource (with accept header = application/json) 
api.resource.get(format='json') 
# GET /resource?attr=value 
api.resource.get(attr=value) 
# POST /resource 
api.resource.post(attr=value, attr2=value2, ...) 
# GET /resource/id/resource_collection 
api.resoure(id).resource_collection().get() 
2014/09/24 APIconUK 2014 57 / 149
Adhoc Binding 
☺ 
api = API('http://myrestful/api/v1') 
# GET /resource 
api.resource.get() 
# GET /resource (with accept header = application/json) 
api.resource.get(format='json') 
# GET /resource?attr=value 
api.resource.get(attr=value) 
# POST /resource 
api.resource.post(attr=value, attr2=value2, ...) 
# GET /resource/id/resource_collection 
api.resoure(id).resource_collection().get() 
☹ 
2014/09/24 APIconUK 2014 58 / 149
SDKs 
2014/09/24 APIconUK 2014 59 / 149
SDKs 
● HTTP Clients 
2014/09/24 APIconUK 2014 60 / 149
SDKs 
● HTTP Clients 
● REST Clients 
2014/09/24 APIconUK 2014 61 / 149
SDKs 
● HTTP Clients 
● REST Clients 
● Socket Pools 
2014/09/24 APIconUK 2014 62 / 149
SDKs 
● HTTP Clients 
● REST Clients 
● Socket Pools 
● Request Builders 
2014/09/24 APIconUK 2014 63 / 149
SDKs 
● HTTP Clients 
● REST Clients 
● Socket Pools 
● Request Builders 
● URI Concatenators 
2014/09/24 APIconUK 2014 64 / 149
SDKs 
● HTTP Clients 
● REST Clients 
● Socket Pools 
● Request Builders 
● URI Concatenators 
● OAuth Implementations 
2014/09/24 APIconUK 2014 65 / 149
SDKs 
2014/09/24 APIconUK 2014 66 / 149
SDKs 
● PHP 
● Python 
● Ruby 
● .NET 
● Java 
● C, C++ 
● Perl 
● Android, iOS, Windows Mobile, Blackberry 
● Javascript 
2014/09/24 APIconUK 2014 67 / 149
ctypes 
https://docs.python.org/2/library/ctypes.html 
2014/09/24 APIconUK 2014 68 / 149
ctypes 
>>> from ctypes import * 
>>> cdll.LoadLibrary("libc.so.6") 
<CDLL 'libc.so.6', handle 7f408bf8a000 at 21eb8d0> 
>>> libc = CDLL("libc.so.6") 
>>> my_printf = libc.printf 
>>> my_printf("Hello World") 
Hello World11 
>>> my_printf("Hello %s", "Andy") 
Hello Andy10 
2014/09/24 APIconUK 2014 69 / 149
ctypes 
>>> from ctypes import * 
>>> cdll.LoadLibrary("libc.so.6") 
<CDLL 'libc.so.6', handle 7f408bf8a000 at 21eb8d0> 
>>> libc = CDLL("libc.so.6") 
>>> my_printf = libc.printf 
>>> my_printf("Hello World") 
Hello World11 
>>> my_printf("Hello %s", "Andy") 
Hello Andy10 
2014/09/24 APIconUK 2014 70 / 149
ctypes 
>>> from ctypes import * 
>>> cdll.LoadLibrary("libc.so.6") 
<CDLL 'libc.so.6', handle 7f408bf8a000 at 21eb8d0> 
>>> libc = CDLL("libc.so.6") 
>>> my_printf = libc.printf 
>>> my_printf("Hello World") 
Hello World11 
>>> my_printf("Hello %s", "Andy") 
Hello Andy10 
2014/09/24 APIconUK 2014 71 / 149
ctypes 
>>> from ctypes import * 
>>> cdll.LoadLibrary("libc.so.6") 
<CDLL 'libc.so.6', handle 7f408bf8a000 at 21eb8d0> 
>>> libc = CDLL("libc.so.6") 
>>> my_printf = libc.printf 
>>> my_printf("Hello World") 
Hello World11 
>>> my_printf("Hello %s", "Andy") 
Hello Andy10 
2014/09/24 APIconUK 2014 72 / 149
ctypes 
● Code Loading 
● Calling Conventions 
● Marshalling 
● Memory Models 
2014/09/24 APIconUK 2014 73 / 149
● HTTP Implementation 
● HTTP Client 
● URI / URL Library 
● Media Format Libraries 
2014/09/24 APIconUK 2014 74 / 149
● HTTP Implementation 
● HTTP Client 
● URI / URL Library 
● Media Format Libraries 
● A Way To Put It All Together 
2014/09/24 APIconUK 2014 75 / 149
Calling Conventions 
https://api-content.dropbox.com/1/files/auto/<path> 
2014/09/24 APIconUK 2014 76 / 149
Calling Conventions 
https://api-content.dropbox.com/1/files/auto/<path> 
https://example.com/price/<date>/<€>/<£> 
2014/09/24 APIconUK 2014 77 / 149
Calling Conventions 
https://api-content.dropbox.com/1/files/auto/<path> 
https://example.com/price/<date>/<€>/<£> 
2014/09/24 APIconUK 2014 78 / 149
Calling Conventions 
files(<path>) 
price(<date>, <€>, <£>) 
2014/09/24 APIconUK 2014 79 / 149
Calling Conventions 
https://api.dropbox.com/1/delta?cursor=<x> 
https://example.com/trades?tick=<n> 
2014/09/24 APIconUK 2014 80 / 149
Calling Conventions 
delta(cursor=<x>) 
trades(tick=<n>) 
2014/09/24 APIconUK 2014 81 / 149
Calling Conventions 
https://.../1/revisions/auto/<path>?rev_limit=<y> 
https://example.com/trades/<stock>?tick=<y> 
2014/09/24 APIconUK 2014 82 / 149
Calling Conventions 
revisions(<path>, rev_limit=<y>) 
trades(<stock>, tick=<y>) 
2014/09/24 APIconUK 2014 83 / 149
Calling Conventions 
(define (name pos-arg-1 pos-arg-2 #!key key-arg-1) 
… 
result) 
2014/09/24 APIconUK 2014 84 / 149
Calling Conventions 
(define (add a b) 
(+ a b)) 
2014/09/24 APIconUK 2014 85 / 149
Calling Conventions 
(define (add a b) 
(+ a b)) 
(add 19 47) 
2014/09/24 APIconUK 2014 86 / 149
Calling Conventions 
(define (add a b) 
(+ a b)) 
(add 19 47) 
66 
2014/09/24 APIconUK 2014 87 / 149
Calling Conventions 
(define (add a b) 
(+ a b)) 
(add 19 47) 
66 
(define (raise n #!key power) 
(expt n power)) 
2014/09/24 APIconUK 2014 88 / 149
Calling Conventions 
(define (add a b) 
(+ a b)) 
(add 19 47) 
66 
(define (raise n #!key power) 
(expt n power)) 
(raise 2 power: 4) 
2014/09/24 APIconUK 2014 89 / 149
Calling Conventions 
(define (add a b) 
(+ a b)) 
(add 19 47) 
66 
(define (raise n #!key power) 
(expt n power)) 
(raise 2 power: 4) 
16 
2014/09/24 APIconUK 2014 90 / 149
Putting It All Together 
(use rest-bind) 
(define-method 
(procedure-name path-arg... #!key query-arg...) 
uri-or-request 
body-writer 
body-reader 
#!optional 
header-reader) 
2014/09/24 APIconUK 2014 91 / 149
Putting It All Together 
(use rest-bind) 
(define-method 
(procedure-name path-arg... #!key query-arg...) 
uri-or-request 
body-writer 
body-reader 
#!optional 
header-reader) 
2014/09/24 APIconUK 2014 92 / 149
Putting It All Together 
(use rest-bind) 
(define-method 
(procedure-name path-arg... #!key query-arg...) 
uri-or-request 
body-writer 
body-reader 
#!optional 
header-reader) 
2014/09/24 APIconUK 2014 93 / 149
Putting It All Together 
(use rest-bind) 
(define-method 
(procedure-name path-arg... #!key query-arg...) 
uri-or-request 
body-writer 
body-reader 
#!optional 
header-reader) 
2014/09/24 APIconUK 2014 94 / 149
Putting It All Together 
(use rest-bind) 
(define-method 
(procedure-name path-arg... #!key query-arg...) 
uri-or-request 
body-writer 
body-reader 
#!optional 
header-reader) 
2014/09/24 APIconUK 2014 95 / 149
Putting It All Together 
(use rest-bind) 
(define-method 
(procedure-name path-arg... #!key query-arg...) 
uri-or-request 
body-writer 
body-reader 
#!optional 
header-reader) 
2014/09/24 APIconUK 2014 96 / 149
Putting It All Together 
(use rest-bind) 
(define-method 
(procedure-name path-arg... #!key query-arg...) 
uri-or-request 
body-writer 
body-reader 
#!optional 
header-reader) 
2014/09/24 APIconUK 2014 97 / 149
Putting It All Together 
(use rest-bind) 
(define-method 
(procedure-name path-arg... #!key query-arg...) 
uri-or-request 
body-writer 
body-reader 
#!optional 
header-reader) 
2014/09/24 APIconUK 2014 98 / 149
Putting It All Together 
https://api.dropbox.com/1/account/info 
2014/09/24 APIconUK 2014 99 / 149
Putting It All Together 
https://api.dropbox.com/1/account/info 
(define-method (account/info #!key locale) 
"https://api.dropbox.com/1/account/info" 
#f 
read-json) 
2014/09/24 APIconUK 2014 100 / 149
Putting It All Together 
https://api.dropbox.com/1/account/info 
(define-method (account/info #!key locale) 
"https://api.dropbox.com/1/account/info" 
#f 
read-json) 
#;> account/info 
#<procedure (? #!key locale) 
2014/09/24 APIconUK 2014 101 / 149
Marshalling / Unmarshalling 
https://api.dropbox.com/1/account/info 
(define-method (account/info #!key locale) 
"https://api.dropbox.com/1/account/info" 
#f 
read-json) 
#;> account/info 
#<procedure (? #!key locale) 
2014/09/24 APIconUK 2014 102 / 149
Marshalling / Unmarshalling 
https://api.dropbox.com/1/account/info 
2014/09/24 APIconUK 2014 103 / 149
Marshalling / Unmarshalling 
https://api.dropbox.com/1/account/info 
{ 
"referral_link": "https://www.dropbox.com/referrals/r1a2n3d4m5s6t7", 
"display_name": "John P. User", 
"uid": 12345678, 
"team": { 
"name": "Acme Inc." 
}, 
"country": "US", 
"quota_info": { 
"shared": 253738410565, 
"quota": 107374182400000, 
"normal": 680031877871 
} 
} 
2014/09/24 APIconUK 2014 104 / 149
Marshalling / Unmarshalling 
https://api.dropbox.com/1/account/info 
((referral_link . "https://www.dropbox.com/referrals/r1a2n3d4m5s6t7") 
(display_name . "John P. User") 
(uid . 12345678) 
(country . "US") 
(quota_info 
(shared . 253738410565) 
(quota . 107374182400000) 
(normal . 680031877871))) 
2014/09/24 APIconUK 2014 105 / 149
Marshalling / Unmarshalling 
(account/info) 
2014/09/24 APIconUK 2014 106 / 149
Marshalling / Unmarshalling 
(account/info) 
read-string 
{ 
"referral_link": "https://www.dropbox.com/referrals/r1a2n3d4m5s6t7", 
"display_name": "John P. User", 
"uid": 12345678, 
"team": { 
"name": "Acme Inc." 
}, 
"country": "US", 
"quota_info": { 
"shared": 253738410565, 
"quota": 107374182400000, 
"normal": 680031877871 
} 
} 
2014/09/24 APIconUK 2014 107 / 149
Marshalling / Unmarshalling 
(account/info) 
read-json 
((referral_link . "https://www.dropbox.com/referrals/r1a2n3d4m5s6t7") 
(display_name . "John P. User") 
(uid . 12345678) 
(country . "US") 
(quota_info 
(shared . 253738410565) 
(quota . 107374182400000) 
(normal . 680031877871))) 
2014/09/24 APIconUK 2014 108 / 149
Calling Conventions 
https://example.com/trades/<stock>?tick=<y> 
(define-method (trades stock #!key tick) 
"https://examples.com/trades") 
#f 
read-json) 
2014/09/24 APIconUK 2014 109 / 149
Calling Conventions 
(use rest-bind) 
(define-method 
(procedure-name path-arg... #!key query-arg...) 
uri-or-request 
body-writer 
body-reader 
#!optional 
header-reader) 
2014/09/24 APIconUK 2014 110 / 149
Calling Conventions 
(use rest-bind) 
(define-method 
(procedure-name path-arg... #!key query-arg...) 
uri-or-request 
body-writer 
body-reader 
#!optional 
header-reader) 
2014/09/24 APIconUK 2014 111 / 149
Calling Conventions 
https://example.com/trades/<stock>?tick=<y> 
(define-method (trades stock #!key tick) 
"https://examples.com/trades") 
#f 
read-json) 
2014/09/24 APIconUK 2014 112 / 149
Calling Conventions 
https://example.com/trades/<stock>?tick=<y> 
(define-method (trades stock #!key tick) 
"https://examples.com/trades") 
#f 
read-json) 
2014/09/24 APIconUK 2014 113 / 149
Calling Conventions 
https://example.com/trades/<stock>?tick=<y> 
(define-method (trades stock #!key tick) 
(make-request 
method: 'PUT 
uri: (uri-reference: "https://examples.com/trades") 
#f 
read-json) 
2014/09/24 APIconUK 2014 114 / 149
Calling Conventions 
https://example.com/trades/<stock>?tick=<y> 
(define-method (trades stock #!key tick) 
(make-request 
method: 'PUT 
uri: (uri-reference: "https://examples.com/trades") 
headers: '(accept #(application/json ((q . 0.5))))) 
#f 
read-json) 
2014/09/24 APIconUK 2014 115 / 149
Putting It All Together 
(trades 'LON:TSCO tick: 3) 
2014/09/24 APIconUK 2014 116 / 149
Putting It All Together 
(trades 'LON:TSCO tick: 3) 
((1411602130 . 19490 
1411602133 . +6 
1411602136 . +1 
1411602139 . -2 
1411602142 . +3 
1411602145 . +1 
1411602148 . -2 
1411602151 . -1 
1411602154 . 0 
1411602157 . +1)) 
2014/09/24 APIconUK 2014 117 / 149
● HTTP Implementation 
● HTTP Client 
● URI / URL Library 
● Media Format Libraries 
● A Way To Put It All Together 
2014/09/24 APIconUK 2014 118 / 149
● HTTP Implementation 
● HTTP Client 
● URI / URL Library 
● Media Format Libraries 
● A Way To Put It All Together 
2014/09/24 APIconUK 2014 119 / 149
● HTTP Implementation 
● HTTP Client 
● URI / URL Library 
● Media Format Libraries 
● A Way To Put It All Together 
66 lines 
2014/09/24 APIconUK 2014 120 / 149
Putting It All Together 
(module dropbox-lolevel 
(dropbox 
make-dropbox-app 
account/info 
files:get 
files:put 
files:post 
metadata 
delta 
revisions 
restore 
search 
shares 
media 
copy-ref 
thumbnails 
chunked_upload 
commit_chunked_upload 
fileops/copy 
fileops/create_folder 
fileops/delete 
fileops/move 
callback 
old-output-port) 
2014/09/24 APIconUK 2014 121 / 149
oauth 
Dropbox 
2014/09/24 APIconUK 2014 122 / 149
oauth 
Dropbox 
A User 
2014/09/24 APIconUK 2014 123 / 149
oauth 
Dropbox 
A User 
Knodium 
2014/09/24 APIconUK 2014 124 / 149
oauth 
Dropbox 
A User 
Knodium 
2014/09/24 APIconUK 2014 125 / 149
oauth 
Dropbox 
A User 
Knodium 
2014/09/24 APIconUK 2014 126 / 149
oauth 
Dropbox 
A User 
Knodium 
2014/09/24 APIconUK 2014 127 / 149
oauth 
Dropbox 
A User 
Knodium 
2014/09/24 APIconUK 2014 128 / 149
oauth 
Dropbox 
A User 
Knodium 
2014/09/24 APIconUK 2014 129 / 149
oauth 
Dropbox 
A User 
Knodium 
2014/09/24 APIconUK 2014 130 / 149
oauth 
Dropbox 
A User 
Knodium 
2014/09/24 APIconUK 2014 131 / 149
oauth 
Dropbox 
A User 
Knodium 
2014/09/24 APIconUK 2014 132 / 149
oauth 
Dropbox 
A User 
Knodium 
2014/09/24 APIconUK 2014 133 / 149
oauth 
Dropbox 
A User 
Knodium 
2014/09/24 APIconUK 2014 134 / 149
oauth 
Dropbox 
A User 
Knodium 
2014/09/24 APIconUK 2014 135 / 149
oauth 
Dropbox 
A User 
Knodium 
2014/09/24 APIconUK 2014 136 / 149
oauth 
(use oauth-client) 
(define dropbox 
(make-oauth-service-provider 
protocol-version: 1.0 
credential-request-url: "https://api.dropbox.com/1/oauth/request_token" 
owner-auth-url: "https://www.dropbox.com/1/oauth/authorize" 
token-request-url: "https://api.dropbox.com/1/oauth/access_token" 
signature-method: 'plaintext)) 
2014/09/24 APIconUK 2014 137 / 149
(use oauth-client) 
(define dropbox-app 
(make-oauth-service 
oauth 
service: dropbox 
client-credential: (make-oauth-credential "<token>" "<secret>"))) 
2014/09/24 APIconUK 2014 138 / 149
oauth 
Dropbox 
A User 
Knodium 
2014/09/24 APIconUK 2014 139 / 149
Putting it all together 
(with-oauth <app> <credential> 
...) 
2014/09/24 APIconUK 2014 140 / 149
Putting it all together 
(account/info) 
2014/09/24 APIconUK 2014 141 / 149
Putting it all together 
(with-oauth <app> <credential> 
(account/info)) 
2014/09/24 APIconUK 2014 142 / 149
Putting it all together 
(account/info) 
2014/09/24 APIconUK 2014 143 / 149
Putting it all together 
(account/info) 
2014/09/24 APIconUK 2014 144 / 149
Putting it all together 
(display-name) 
(account/info) 
2014/09/24 APIconUK 2014 145 / 149
Putting it all together 
(web-page-logic) 
(display-name) 
(account/info) 
2014/09/24 APIconUK 2014 146 / 149
Putting it all together 
(request-routing) 
(web-page-logic) 
(display-name) 
(account/info) 
2014/09/24 APIconUK 2014 147 / 149
Putting it all together 
(with-oauth <app> <credential>) 
(request-routing) 
(web-page-logic) 
(display-name) 
(account/info) 
2014/09/24 APIconUK 2014 148 / 149
? 
2014/09/24 APIconUK 2014 149 / 149
2014/09/24 APIconUK 2014 150 / 149
URIs & URLs Are Not Strings 
https://example.com/price/<x> 
2014/09/24 APIconUK 2014 151 / 149
URIs & URLs Are Not Strings 
https://example.com/price/<x>?tick=<n> 
2014/09/24 APIconUK 2014 152 / 149
URIs & URLs Are Not Strings 
https://example.com/price/<x>?tick=<n> 
2014/09/24 APIconUK 2014 153 / 149
URIs & URLs Are Not Strings 
https://example.com/price/<x>?tick=<n> 
2014/09/24 APIconUK 2014 154 / 149
URIs & URLs Are Not Strings 
https://example.com/price/<x>?tick=<n> 
https://example.com/price/<x>/<y> 
2014/09/24 APIconUK 2014 155 / 149
URIs & URLs Are Not Strings 
https://example.com/price/<x>/<y>?tick=<n> 
2014/09/24 APIconUK 2014 156 / 149
URIs & URLs Are Not Strings 
https://user:pass@example.com/price?tick=3#appendix 
2014/09/24 APIconUK 2014 157 / 149
URIs & URLs Are Not Strings 
https://user:pass@example.com/price?tick=3#appendix 
2014/09/24 APIconUK 2014 158 / 149
URIs & URLs Are Not Strings 
https://user:pass@example.com/price?tick=3#appendix 
2014/09/24 APIconUK 2014 159 / 149
URIs & URLs Are Not Strings 
https://user:pass@example.com/price?tick=3#appendix 
2014/09/24 APIconUK 2014 160 / 149
URIs & URLs Are Not Strings 
https://user:pass@example.com/price?tick=3#appendix 
2014/09/24 APIconUK 2014 161 / 149
URIs & URLs Are Not Strings 
https://user:pass@example.com/price?tick=3#appendix 
2014/09/24 APIconUK 2014 162 / 149
URIs & URLs Are Not Strings 
https://user:pass@example.com/price?tick=3#appendix 
2014/09/24 APIconUK 2014 163 / 149
URIs & URLs Are Not Strings 
https://user:pass@example.com/price?tick=3#appendix 
2014/09/24 APIconUK 2014 164 / 149
URIs & URLs Are Not Strings 
https://user:pass@example.com/price?tick=3#appendix 
ftp://example.com 
//example.com/resource 
//example.com 
/book 
?length=17;width=19 
?depth=21&height=29#glossary 
#chapter1 
2014/09/24 APIconUK 2014 165 / 149
URIs & URLs Are Not Strings 
https://user:pass@example.com/price?tick=3#appendix 
ftp://example.com 
//example.com/resource 
//example.com 
/book 
?length=17;width=19 
?depth=21&height=29#glossary 
#chapter1 
2014/09/24 APIconUK 2014 166 / 149

More Related Content

What's hot

Swift Cloud Workshop - Swift Microservices
Swift Cloud Workshop - Swift MicroservicesSwift Cloud Workshop - Swift Microservices
Swift Cloud Workshop - Swift MicroservicesChris Bailey
 
Node.js streaming csv downloads proxy
Node.js streaming csv downloads proxyNode.js streaming csv downloads proxy
Node.js streaming csv downloads proxyIsmael Celis
 
Observability with Consul Connect
Observability with Consul ConnectObservability with Consul Connect
Observability with Consul ConnectBram Vogelaar
 
服务框架: Thrift & PasteScript
服务框架: Thrift & PasteScript服务框架: Thrift & PasteScript
服务框架: Thrift & PasteScriptQiangning Hong
 
Railsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshareRailsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slidesharetomcopeland
 
Bootstrapping multidc observability stack
Bootstrapping multidc observability stackBootstrapping multidc observability stack
Bootstrapping multidc observability stackBram Vogelaar
 
Into the ZF2 Service Manager
Into the ZF2 Service ManagerInto the ZF2 Service Manager
Into the ZF2 Service ManagerChris Tankersley
 
Nodejs Explained with Examples
Nodejs Explained with ExamplesNodejs Explained with Examples
Nodejs Explained with ExamplesGabriele Lana
 
How I Learned to Stop Worrying and Love the Cloud - Wesley Beary, Engine Yard
How I Learned to Stop Worrying and Love the Cloud - Wesley Beary, Engine YardHow I Learned to Stop Worrying and Love the Cloud - Wesley Beary, Engine Yard
How I Learned to Stop Worrying and Love the Cloud - Wesley Beary, Engine YardSV Ruby on Rails Meetup
 
Java Servlet Programming under Ubuntu Linux by Tushar B Kute
Java Servlet Programming under Ubuntu Linux by Tushar B KuteJava Servlet Programming under Ubuntu Linux by Tushar B Kute
Java Servlet Programming under Ubuntu Linux by Tushar B KuteTushar B Kute
 
Ansible fest Presentation slides
Ansible fest Presentation slidesAnsible fest Presentation slides
Ansible fest Presentation slidesAaron Carey
 
Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015Masahiro Nagano
 
Relay: The Next Leg, Eric Sorenson, Puppet
Relay: The Next Leg, Eric Sorenson, PuppetRelay: The Next Leg, Eric Sorenson, Puppet
Relay: The Next Leg, Eric Sorenson, PuppetPuppet
 
Hopping in clouds: a tale of migration from one cloud provider to another
Hopping in clouds: a tale of migration from one cloud provider to anotherHopping in clouds: a tale of migration from one cloud provider to another
Hopping in clouds: a tale of migration from one cloud provider to anotherMichele Orselli
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryTatsuhiko Miyagawa
 

What's hot (20)

Refactoring terraform
Refactoring terraformRefactoring terraform
Refactoring terraform
 
Swift Cloud Workshop - Swift Microservices
Swift Cloud Workshop - Swift MicroservicesSwift Cloud Workshop - Swift Microservices
Swift Cloud Workshop - Swift Microservices
 
Node.js streaming csv downloads proxy
Node.js streaming csv downloads proxyNode.js streaming csv downloads proxy
Node.js streaming csv downloads proxy
 
Observability with Consul Connect
Observability with Consul ConnectObservability with Consul Connect
Observability with Consul Connect
 
Intro to Terraform
Intro to TerraformIntro to Terraform
Intro to Terraform
 
服务框架: Thrift & PasteScript
服务框架: Thrift & PasteScript服务框架: Thrift & PasteScript
服务框架: Thrift & PasteScript
 
AngularDart - Meetup 15/03/2017
AngularDart - Meetup 15/03/2017AngularDart - Meetup 15/03/2017
AngularDart - Meetup 15/03/2017
 
Railsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshareRailsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshare
 
Bootstrapping multidc observability stack
Bootstrapping multidc observability stackBootstrapping multidc observability stack
Bootstrapping multidc observability stack
 
Into the ZF2 Service Manager
Into the ZF2 Service ManagerInto the ZF2 Service Manager
Into the ZF2 Service Manager
 
Nodejs Explained with Examples
Nodejs Explained with ExamplesNodejs Explained with Examples
Nodejs Explained with Examples
 
How I Learned to Stop Worrying and Love the Cloud - Wesley Beary, Engine Yard
How I Learned to Stop Worrying and Love the Cloud - Wesley Beary, Engine YardHow I Learned to Stop Worrying and Love the Cloud - Wesley Beary, Engine Yard
How I Learned to Stop Worrying and Love the Cloud - Wesley Beary, Engine Yard
 
Dart on server - Meetup 18/05/2017
Dart on server - Meetup 18/05/2017Dart on server - Meetup 18/05/2017
Dart on server - Meetup 18/05/2017
 
Java Servlet Programming under Ubuntu Linux by Tushar B Kute
Java Servlet Programming under Ubuntu Linux by Tushar B KuteJava Servlet Programming under Ubuntu Linux by Tushar B Kute
Java Servlet Programming under Ubuntu Linux by Tushar B Kute
 
Ansible fest Presentation slides
Ansible fest Presentation slidesAnsible fest Presentation slides
Ansible fest Presentation slides
 
Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015
 
Final terraform
Final terraformFinal terraform
Final terraform
 
Relay: The Next Leg, Eric Sorenson, Puppet
Relay: The Next Leg, Eric Sorenson, PuppetRelay: The Next Leg, Eric Sorenson, Puppet
Relay: The Next Leg, Eric Sorenson, Puppet
 
Hopping in clouds: a tale of migration from one cloud provider to another
Hopping in clouds: a tale of migration from one cloud provider to anotherHopping in clouds: a tale of migration from one cloud provider to another
Hopping in clouds: a tale of migration from one cloud provider to another
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
 

Viewers also liked

Innovation showcase: Markus Lanthaler, Developer, Consultant, Researcher,mark...
Innovation showcase: Markus Lanthaler, Developer, Consultant, Researcher,mark...Innovation showcase: Markus Lanthaler, Developer, Consultant, Researcher,mark...
Innovation showcase: Markus Lanthaler, Developer, Consultant, Researcher,mark...ProgrammableWeb
 
How And Why To Dogfood Your API
How And Why To Dogfood Your APIHow And Why To Dogfood Your API
How And Why To Dogfood Your APIProgrammableWeb
 
Open Source And the Internet Of Things
Open Source And the Internet Of ThingsOpen Source And the Internet Of Things
Open Source And the Internet Of ThingsProgrammableWeb
 
Get Your Software Speaking SMS With Esendex
Get Your Software Speaking SMS With EsendexGet Your Software Speaking SMS With Esendex
Get Your Software Speaking SMS With EsendexProgrammableWeb
 
The Future of API Monetization
The Future of API MonetizationThe Future of API Monetization
The Future of API MonetizationProgrammableWeb
 
Profiting From "Smart City" APIs
Profiting From "Smart City" APIsProfiting From "Smart City" APIs
Profiting From "Smart City" APIsProgrammableWeb
 
Your API Deserves More Respect: Make It A Product
Your API Deserves More Respect: Make It A ProductYour API Deserves More Respect: Make It A Product
Your API Deserves More Respect: Make It A ProductProgrammableWeb
 
Building A Business-Facing Mobile Developer Community
Building A Business-Facing Mobile Developer CommunityBuilding A Business-Facing Mobile Developer Community
Building A Business-Facing Mobile Developer CommunityProgrammableWeb
 
Fastest Growing Web API Categories: Last 6 Months
Fastest Growing Web API Categories: Last 6 MonthsFastest Growing Web API Categories: Last 6 Months
Fastest Growing Web API Categories: Last 6 MonthsProgrammableWeb
 
Real World API Business Models That Worked
Real World API Business Models That WorkedReal World API Business Models That Worked
Real World API Business Models That WorkedProgrammableWeb
 
ProgrammableWeb's eSignature API Research Report
ProgrammableWeb's eSignature API Research ReportProgrammableWeb's eSignature API Research Report
ProgrammableWeb's eSignature API Research ReportProgrammableWeb
 

Viewers also liked (12)

Innovation showcase: Markus Lanthaler, Developer, Consultant, Researcher,mark...
Innovation showcase: Markus Lanthaler, Developer, Consultant, Researcher,mark...Innovation showcase: Markus Lanthaler, Developer, Consultant, Researcher,mark...
Innovation showcase: Markus Lanthaler, Developer, Consultant, Researcher,mark...
 
How And Why To Dogfood Your API
How And Why To Dogfood Your APIHow And Why To Dogfood Your API
How And Why To Dogfood Your API
 
Open Source And the Internet Of Things
Open Source And the Internet Of ThingsOpen Source And the Internet Of Things
Open Source And the Internet Of Things
 
Get Your Software Speaking SMS With Esendex
Get Your Software Speaking SMS With EsendexGet Your Software Speaking SMS With Esendex
Get Your Software Speaking SMS With Esendex
 
The Future of API Monetization
The Future of API MonetizationThe Future of API Monetization
The Future of API Monetization
 
Profiting From "Smart City" APIs
Profiting From "Smart City" APIsProfiting From "Smart City" APIs
Profiting From "Smart City" APIs
 
Your API Deserves More Respect: Make It A Product
Your API Deserves More Respect: Make It A ProductYour API Deserves More Respect: Make It A Product
Your API Deserves More Respect: Make It A Product
 
Building A Business-Facing Mobile Developer Community
Building A Business-Facing Mobile Developer CommunityBuilding A Business-Facing Mobile Developer Community
Building A Business-Facing Mobile Developer Community
 
SOAP vs REST
SOAP vs RESTSOAP vs REST
SOAP vs REST
 
Fastest Growing Web API Categories: Last 6 Months
Fastest Growing Web API Categories: Last 6 MonthsFastest Growing Web API Categories: Last 6 Months
Fastest Growing Web API Categories: Last 6 Months
 
Real World API Business Models That Worked
Real World API Business Models That WorkedReal World API Business Models That Worked
Real World API Business Models That Worked
 
ProgrammableWeb's eSignature API Research Report
ProgrammableWeb's eSignature API Research ReportProgrammableWeb's eSignature API Research Report
ProgrammableWeb's eSignature API Research Report
 

Similar to HTTP APIs as first class procedures in your language: cutting out SDK complexity.

Docker for Ruby Developers
Docker for Ruby DevelopersDocker for Ruby Developers
Docker for Ruby DevelopersAptible
 
Google Cloud Endpoints: Building Third-Party APIs on Google AppEngine
Google Cloud Endpoints: Building Third-Party APIs on Google AppEngineGoogle Cloud Endpoints: Building Third-Party APIs on Google AppEngine
Google Cloud Endpoints: Building Third-Party APIs on Google AppEngineRoman Kirillov
 
Presto anatomy
Presto anatomyPresto anatomy
Presto anatomyDongmin Yu
 
MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know Norberto Leite
 
Mongo+java (1)
Mongo+java (1)Mongo+java (1)
Mongo+java (1)MongoDB
 
2014 09 30_sparkling_water_hands_on
2014 09 30_sparkling_water_hands_on2014 09 30_sparkling_water_hands_on
2014 09 30_sparkling_water_hands_onSri Ambati
 
What's New In Laravel 5
What's New In Laravel 5What's New In Laravel 5
What's New In Laravel 5Darren Craig
 
2019 11-bgphp
2019 11-bgphp2019 11-bgphp
2019 11-bgphpdantleech
 
Testing multi outputformat based mapreduce
Testing multi outputformat based mapreduceTesting multi outputformat based mapreduce
Testing multi outputformat based mapreduceAshok Agarwal
 
How and why i roll my own node.js framework
How and why i roll my own node.js frameworkHow and why i roll my own node.js framework
How and why i roll my own node.js frameworkBen Lin
 
adaptTo() 2014 - Integrating Open Source Search with CQ/AEM
adaptTo() 2014 - Integrating Open Source Search with CQ/AEMadaptTo() 2014 - Integrating Open Source Search with CQ/AEM
adaptTo() 2014 - Integrating Open Source Search with CQ/AEMtherealgaston
 
[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기NAVER D2
 
GDG Devfest 2019 - Build go kit microservices at kubernetes with ease
GDG Devfest 2019 - Build go kit microservices at kubernetes with easeGDG Devfest 2019 - Build go kit microservices at kubernetes with ease
GDG Devfest 2019 - Build go kit microservices at kubernetes with easeKAI CHU CHUNG
 
SQLite Techniques
SQLite TechniquesSQLite Techniques
SQLite Techniquesjoaopmaia
 
Into The Box 2018 Going live with commandbox and docker
Into The Box 2018 Going live with commandbox and dockerInto The Box 2018 Going live with commandbox and docker
Into The Box 2018 Going live with commandbox and dockerOrtus Solutions, Corp
 
Going live with BommandBox and docker Into The Box 2018
Going live with BommandBox and docker Into The Box 2018Going live with BommandBox and docker Into The Box 2018
Going live with BommandBox and docker Into The Box 2018Ortus Solutions, Corp
 
Async programming on NET
Async programming on NETAsync programming on NET
Async programming on NETyuyijq
 

Similar to HTTP APIs as first class procedures in your language: cutting out SDK complexity. (20)

Docker for Ruby Developers
Docker for Ruby DevelopersDocker for Ruby Developers
Docker for Ruby Developers
 
Google Cloud Endpoints: Building Third-Party APIs on Google AppEngine
Google Cloud Endpoints: Building Third-Party APIs on Google AppEngineGoogle Cloud Endpoints: Building Third-Party APIs on Google AppEngine
Google Cloud Endpoints: Building Third-Party APIs on Google AppEngine
 
Presto anatomy
Presto anatomyPresto anatomy
Presto anatomy
 
MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know
 
Mongo+java (1)
Mongo+java (1)Mongo+java (1)
Mongo+java (1)
 
2014 09 30_sparkling_water_hands_on
2014 09 30_sparkling_water_hands_on2014 09 30_sparkling_water_hands_on
2014 09 30_sparkling_water_hands_on
 
What's New In Laravel 5
What's New In Laravel 5What's New In Laravel 5
What's New In Laravel 5
 
2019 11-bgphp
2019 11-bgphp2019 11-bgphp
2019 11-bgphp
 
Concurrent networking - made easy
Concurrent networking - made easyConcurrent networking - made easy
Concurrent networking - made easy
 
Testing multi outputformat based mapreduce
Testing multi outputformat based mapreduceTesting multi outputformat based mapreduce
Testing multi outputformat based mapreduce
 
How and why i roll my own node.js framework
How and why i roll my own node.js frameworkHow and why i roll my own node.js framework
How and why i roll my own node.js framework
 
adaptTo() 2014 - Integrating Open Source Search with CQ/AEM
adaptTo() 2014 - Integrating Open Source Search with CQ/AEMadaptTo() 2014 - Integrating Open Source Search with CQ/AEM
adaptTo() 2014 - Integrating Open Source Search with CQ/AEM
 
[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기
 
GDG Devfest 2019 - Build go kit microservices at kubernetes with ease
GDG Devfest 2019 - Build go kit microservices at kubernetes with easeGDG Devfest 2019 - Build go kit microservices at kubernetes with ease
GDG Devfest 2019 - Build go kit microservices at kubernetes with ease
 
SQLite Techniques
SQLite TechniquesSQLite Techniques
SQLite Techniques
 
Into The Box 2018 Going live with commandbox and docker
Into The Box 2018 Going live with commandbox and dockerInto The Box 2018 Going live with commandbox and docker
Into The Box 2018 Going live with commandbox and docker
 
Going live with BommandBox and docker Into The Box 2018
Going live with BommandBox and docker Into The Box 2018Going live with BommandBox and docker Into The Box 2018
Going live with BommandBox and docker Into The Box 2018
 
SQLite Techniques
SQLite TechniquesSQLite Techniques
SQLite Techniques
 
Async programming on NET
Async programming on NETAsync programming on NET
Async programming on NET
 
Arquitecturas de microservicios - Medianet Software
Arquitecturas de microservicios   -  Medianet SoftwareArquitecturas de microservicios   -  Medianet Software
Arquitecturas de microservicios - Medianet Software
 

More from ProgrammableWeb

Why API Security Is More Complicated Than You Think (and Why It’s Your #1 Pri...
Why API Security Is More Complicated Than You Think (and Why It’s Your #1 Pri...Why API Security Is More Complicated Than You Think (and Why It’s Your #1 Pri...
Why API Security Is More Complicated Than You Think (and Why It’s Your #1 Pri...ProgrammableWeb
 
Innovation Showcase: Hugo Fiennes, CEO/Co-Founder, Electric Imp
Innovation Showcase: Hugo Fiennes, CEO/Co-Founder, Electric ImpInnovation Showcase: Hugo Fiennes, CEO/Co-Founder, Electric Imp
Innovation Showcase: Hugo Fiennes, CEO/Co-Founder, Electric ImpProgrammableWeb
 
ProgrammablaWeb's Innovation Showcase: Stefan Zanetti, Founder/CEO, QIPP
ProgrammablaWeb's Innovation Showcase: Stefan Zanetti, Founder/CEO, QIPPProgrammablaWeb's Innovation Showcase: Stefan Zanetti, Founder/CEO, QIPP
ProgrammablaWeb's Innovation Showcase: Stefan Zanetti, Founder/CEO, QIPPProgrammableWeb
 
Innovation Showcase: David Johnston, Decentralized Application Funds
Innovation Showcase: David Johnston, Decentralized Application FundsInnovation Showcase: David Johnston, Decentralized Application Funds
Innovation Showcase: David Johnston, Decentralized Application FundsProgrammableWeb
 
Intro To Orchestrate DBaaS: A Single API For Key/Value, Search, Graph, And Ev...
Intro To Orchestrate DBaaS: A Single API For Key/Value, Search, Graph, And Ev...Intro To Orchestrate DBaaS: A Single API For Key/Value, Search, Graph, And Ev...
Intro To Orchestrate DBaaS: A Single API For Key/Value, Search, Graph, And Ev...ProgrammableWeb
 
Case Study: A Real-World Implementation Of Linked Data
Case Study: A Real-World Implementation Of Linked DataCase Study: A Real-World Implementation Of Linked Data
Case Study: A Real-World Implementation Of Linked DataProgrammableWeb
 
Pivoting Your Business From Product To Platform
Pivoting Your Business From Product To PlatformPivoting Your Business From Product To Platform
Pivoting Your Business From Product To PlatformProgrammableWeb
 
Exploring UK Bus And Train Data With TransportAPI
Exploring UK Bus And Train Data With TransportAPIExploring UK Bus And Train Data With TransportAPI
Exploring UK Bus And Train Data With TransportAPIProgrammableWeb
 
DDD (Delight-Driven Development) Of APIs With RAML
DDD (Delight-Driven Development) Of APIs With RAMLDDD (Delight-Driven Development) Of APIs With RAML
DDD (Delight-Driven Development) Of APIs With RAMLProgrammableWeb
 
Why And How To Leverage Predictive APIs In Any Application
Why And How To Leverage Predictive APIs In Any Application Why And How To Leverage Predictive APIs In Any Application
Why And How To Leverage Predictive APIs In Any Application ProgrammableWeb
 
Is There An API In That (IoT)?
Is There An API In That (IoT)?Is There An API In That (IoT)?
Is There An API In That (IoT)?ProgrammableWeb
 
API Description Languages: Which Is The Right One For Me?
 API Description Languages: Which Is The Right One For Me?  API Description Languages: Which Is The Right One For Me?
API Description Languages: Which Is The Right One For Me? ProgrammableWeb
 
Top 5 Ways To Increase API Adoption
Top 5 Ways To Increase API AdoptionTop 5 Ways To Increase API Adoption
Top 5 Ways To Increase API AdoptionProgrammableWeb
 
Building A Mobile First API When You're Not Mobile First - Tyler Singletary
Building A Mobile First API When You're Not Mobile First - Tyler SingletaryBuilding A Mobile First API When You're Not Mobile First - Tyler Singletary
Building A Mobile First API When You're Not Mobile First - Tyler SingletaryProgrammableWeb
 

More from ProgrammableWeb (14)

Why API Security Is More Complicated Than You Think (and Why It’s Your #1 Pri...
Why API Security Is More Complicated Than You Think (and Why It’s Your #1 Pri...Why API Security Is More Complicated Than You Think (and Why It’s Your #1 Pri...
Why API Security Is More Complicated Than You Think (and Why It’s Your #1 Pri...
 
Innovation Showcase: Hugo Fiennes, CEO/Co-Founder, Electric Imp
Innovation Showcase: Hugo Fiennes, CEO/Co-Founder, Electric ImpInnovation Showcase: Hugo Fiennes, CEO/Co-Founder, Electric Imp
Innovation Showcase: Hugo Fiennes, CEO/Co-Founder, Electric Imp
 
ProgrammablaWeb's Innovation Showcase: Stefan Zanetti, Founder/CEO, QIPP
ProgrammablaWeb's Innovation Showcase: Stefan Zanetti, Founder/CEO, QIPPProgrammablaWeb's Innovation Showcase: Stefan Zanetti, Founder/CEO, QIPP
ProgrammablaWeb's Innovation Showcase: Stefan Zanetti, Founder/CEO, QIPP
 
Innovation Showcase: David Johnston, Decentralized Application Funds
Innovation Showcase: David Johnston, Decentralized Application FundsInnovation Showcase: David Johnston, Decentralized Application Funds
Innovation Showcase: David Johnston, Decentralized Application Funds
 
Intro To Orchestrate DBaaS: A Single API For Key/Value, Search, Graph, And Ev...
Intro To Orchestrate DBaaS: A Single API For Key/Value, Search, Graph, And Ev...Intro To Orchestrate DBaaS: A Single API For Key/Value, Search, Graph, And Ev...
Intro To Orchestrate DBaaS: A Single API For Key/Value, Search, Graph, And Ev...
 
Case Study: A Real-World Implementation Of Linked Data
Case Study: A Real-World Implementation Of Linked DataCase Study: A Real-World Implementation Of Linked Data
Case Study: A Real-World Implementation Of Linked Data
 
Pivoting Your Business From Product To Platform
Pivoting Your Business From Product To PlatformPivoting Your Business From Product To Platform
Pivoting Your Business From Product To Platform
 
Exploring UK Bus And Train Data With TransportAPI
Exploring UK Bus And Train Data With TransportAPIExploring UK Bus And Train Data With TransportAPI
Exploring UK Bus And Train Data With TransportAPI
 
DDD (Delight-Driven Development) Of APIs With RAML
DDD (Delight-Driven Development) Of APIs With RAMLDDD (Delight-Driven Development) Of APIs With RAML
DDD (Delight-Driven Development) Of APIs With RAML
 
Why And How To Leverage Predictive APIs In Any Application
Why And How To Leverage Predictive APIs In Any Application Why And How To Leverage Predictive APIs In Any Application
Why And How To Leverage Predictive APIs In Any Application
 
Is There An API In That (IoT)?
Is There An API In That (IoT)?Is There An API In That (IoT)?
Is There An API In That (IoT)?
 
API Description Languages: Which Is The Right One For Me?
 API Description Languages: Which Is The Right One For Me?  API Description Languages: Which Is The Right One For Me?
API Description Languages: Which Is The Right One For Me?
 
Top 5 Ways To Increase API Adoption
Top 5 Ways To Increase API AdoptionTop 5 Ways To Increase API Adoption
Top 5 Ways To Increase API Adoption
 
Building A Mobile First API When You're Not Mobile First - Tyler Singletary
Building A Mobile First API When You're Not Mobile First - Tyler SingletaryBuilding A Mobile First API When You're Not Mobile First - Tyler Singletary
Building A Mobile First API When You're Not Mobile First - Tyler Singletary
 

Recently uploaded

[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilV3cube
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 

Recently uploaded (20)

[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 

HTTP APIs as first class procedures in your language: cutting out SDK complexity.

  • 1. andyjpb@knodium.com @databasescaling Thursday, 25th September 2014 2014/09/24 APIconUK 2014 1 / 149
  • 2. HTTP APIs As First Class Procedures a@kno.dm @databasescaling Thursday, 25th September 2014 2014/09/24 APIconUK 2014 2 / 149
  • 3. HTTP APIs As First Class Procedures Cutting out SDK Complexity a@kno.dm @databasescaling Thursday, 25th September 2014 2014/09/24 APIconUK 2014 3 / 149
  • 5. GSM AT Command Set cmd AT+CREG "Network Registration (ver.2)" set AT+CREG=[<creg_stat>],<creg_urc>,<ci> read AT+CREG? +CREG:<creg_urc>,<creg_stat>[,<lac>,<ci>] test AT+CREG=? +CREG 2014/09/24 APIconUK 2014 5 / 149
  • 6. GSM AT Command Set cmd AT+CREG "Network Registration (ver.2)" set AT+CREG=[<creg_stat>],<creg_urc>,<ci> read AT+CREG? +CREG:<creg_urc>,<creg_stat>[,<lac>,<ci>] test AT+CREG=? +CREG 2014/09/24 APIconUK 2014 6 / 149
  • 7. GSM AT Command Set cmd AT+CREG "Network Registration (ver.2)" set AT+CREG=[<creg_stat>],<creg_urc>,<ci> read AT+CREG? +CREG:<creg_urc>,<creg_stat>[,<lac>,<ci>] test AT+CREG=? +CREG 2014/09/24 APIconUK 2014 7 / 149
  • 8. GSM AT Command Set cmd AT+CREG "Network Registration (ver.2)" set AT+CREG=[<creg_stat>],<creg_urc>,<ci> read AT+CREG? +CREG:<creg_urc>,<creg_stat>[,<lac>,<ci>] test AT+CREG=? +CREG 2014/09/24 APIconUK 2014 8 / 149
  • 9. GSM AT Command Set cmd AT+CREG "Network Registration (ver.2)" set AT+CREG=[<creg_stat>],<creg_urc>,<ci> read AT+CREG? +CREG:<creg_urc>,<creg_stat>[,<lac>,<ci>] test AT+CREG=? +CREG 2014/09/24 APIconUK 2014 9 / 149
  • 10. GSM AT Command Set cmd AT+CREG "Network Registration (ver.2)" set AT+CREG=[<creg_stat>],<creg_urc>,<ci> read AT+CREG? +CREG:<creg_urc>,<creg_stat>[,<lac>,<ci>] test AT+CREG=? +CREG int AT_CREG_test(int port, struct AT_result* result) { int r = 0; if ((r = sendcmd(port, "AT+CREG=?", result))) return r; return recvresp(port, result); } 2014/09/24 APIconUK 2014 10 / 149
  • 11. Execution Tracing DBrow *CursorNext(DB *env, DBcursor* cursor, DBresult* result) { /* Increment the cursor to the next row in the direction * that the cursor is travelling and return the row to * the caller. */ ... } 2014/09/24 APIconUK 2014 11 / 149
  • 12. Execution Tracing DBrow *CursorNext(DB *env, DBcursor* cursor, DBresult* result); 2014/09/24 APIconUK 2014 12 / 149
  • 13. Execution Tracing DBrow *CursorNext(DB *env, DBcursor* cursor, DBresult* result); 2014/09/24 APIconUK 2014 13 / 149
  • 14. Execution Tracing DBrow *CursorNext(DB *env, DBcursor* cursor, DBresult* result); 2014/09/24 APIconUK 2014 14 / 149
  • 15. Execution Tracing DBrow *CursorNext(DB *env, DBcursor* cursor, DBresult* result) { DBrow *(*original_proc)(DB*, DBcursor*, DBresult*); DBrow *original_result; log(“Entering CursorNext”); DB_serialise(env); Cursor_serialise(cursor); Result_serialise(result); original_proc = dlsym(RTLD_NEXT, “CursorNext”); original_result = (*original_proc)(env, cursor, result); DB_serialise(env); Cursor_serialise(cursor); Result_serialise(result); Log(“Leaving CursorNext”); return (original_result); } 2014/09/24 APIconUK 2014 15 / 149
  • 16. Execution Tracing DBrow *CursorNext(DB *env, DBcursor* cursor, DBresult* result) { DBrow *(*original_proc)(DB*, DBcursor*, DBresult*); DBrow *original_result; log(“Entering CursorNext”); DB_serialise(env); Cursor_serialise(cursor); Result_serialise(result); original_proc = dlsym(RTLD_NEXT, “CursorNext”); original_result = (*original_proc)(env, cursor, result); DB_serialise(env); Cursor_serialise(cursor); Result_serialise(result); Log(“Leaving CursorNext”); return (original_result); } 2014/09/24 APIconUK 2014 16 / 149
  • 17. Execution Tracing DBrow *CursorNext(DB *env, DBcursor* cursor, DBresult* result) { DBrow *(*original_proc)(DB*, DBcursor*, DBresult*); DBrow *original_result; log(“Entering CursorNext”); DB_serialise(env); Cursor_serialise(cursor); Result_serialise(result); original_proc = dlsym(RTLD_NEXT, “CursorNext”); original_result = (*original_proc)(env, cursor, result); DB_serialise(env); Cursor_serialise(cursor); Result_serialise(result); Log(“Leaving CursorNext”); return (original_result); } 2014/09/24 APIconUK 2014 17 / 149
  • 18. Execution Tracing DBrow *CursorNext(DB *env, DBcursor* cursor, DBresult* result) { DBrow *(*original_proc)(DB*, DBcursor*, DBresult*); DBrow *original_result; log(“Entering CursorNext”); DB_serialise(env); Cursor_serialise(cursor); Result_serialise(result); original_proc = dlsym(RTLD_NEXT, “CursorNext”); original_result = (*original_proc)(env, cursor, result); DB_serialise(env); Cursor_serialise(cursor); Result_serialise(result); Log(“Leaving CursorNext”); return (original_result); } 2014/09/24 APIconUK 2014 18 / 149
  • 19. Execution Tracing DBrow *CursorNext(DB *env, DBcursor* cursor, DBresult* result) { DBrow *(*original_proc)(DB*, DBcursor*, DBresult*); DBrow *original_result; log(“Entering CursorNext”); DB_serialise(env); Cursor_serialise(cursor); Result_serialise(result); original_proc = dlsym(RTLD_NEXT, “CursorNext”); original_result = (*original_proc)(env, cursor, result); DB_serialise(env); Cursor_serialise(cursor); Result_serialise(result); Log(“Leaving CursorNext”); return (original_result); } 2014/09/24 APIconUK 2014 19 / 149
  • 42. Scheme 2014/09/24 APIconUK 2014 42 / 149
  • 43. REST Read the HTTP spec! 2014/09/24 APIconUK 2014 43 / 149
  • 44. REST "Finally, I describe the lessons learned from applying REST to the design of the Hypertext Transfer Protocol and Uniform Resource Identifier standards, and from their subsequent deployment in Web client and server software." -- Roy Fielding 2014/09/24 APIconUK 2014 44 / 149
  • 45. REST GET Retrieves a representation of the requested resource (current state) POST Create a new instance of a resource PUT Update an existing instance of a resource DELETE Remove an existing instance of a resource 2014/09/24 APIconUK 2014 45 / 149
  • 47. DCE "The Distributed Computing Environment (DCE) is a software system developed in the early 1990s" 2014/09/24 APIconUK 2014 47 / 149
  • 48. DCE/RPC "This system allows programmers to write distributed software as if it were all working on the same computer, without having to worry about the underlying network code." 2014/09/24 APIconUK 2014 48 / 149
  • 49. DCE/RPC "This system allows programmers to write distributed software as if it were all working on the same computer, without having to worry about the underlying network code." 2014/09/24 APIconUK 2014 49 / 149
  • 50. Adhoc Binding “I'm looking for a pretty generic, fully featured REST client/API in python. Not bare bones, but plush, nice to use.” http://stackoverflow.com/questions/4355997/is-there-a-generic-python-library-to-consume-rest-based-services 2014/09/24 APIconUK 2014 50 / 149
  • 51. Adhoc Binding “...an HTTP resource kit for Python. It allows you to easily access to HTTP resource and build objects around it.” 2014/09/24 APIconUK 2014 51 / 149
  • 52. Adhoc Binding “...an HTTP resource kit for Python. It allows you to easily access to HTTP resource and build objects around it.” “[It] is a full HTTP client using pure socket calls and its own HTTP parser.” 2014/09/24 APIconUK 2014 52 / 149
  • 53. Adhoc Binding api = API('http://myrestful/api/v1') # GET /resource api.resource.get() # GET /resource (with accept header = application/json) api.resource.get(format='json') # GET /resource?attr=value api.resource.get(attr=value) # POST /resource api.resource.post(attr=value, attr2=value2, ...) # GET /resource/id/resource_collection api.resoure(id).resource_collection().get() 2014/09/24 APIconUK 2014 53 / 149
  • 54. Adhoc Binding ☺ api = API('http://myrestful/api/v1') # GET /resource api.resource.get() # GET /resource (with accept header = application/json) api.resource.get(format='json') # GET /resource?attr=value api.resource.get(attr=value) # POST /resource api.resource.post(attr=value, attr2=value2, ...) # GET /resource/id/resource_collection api.resoure(id).resource_collection().get() 2014/09/24 APIconUK 2014 54 / 149
  • 55. Adhoc Binding ☺ api = API('http://myrestful/api/v1') # GET /resource api.resource.get() # GET /resource (with accept header = application/json) api.resource.get(format='json') # GET /resource?attr=value api.resource.get(attr=value) # POST /resource api.resource.post(attr=value, attr2=value2, ...) # GET /resource/id/resource_collection api.resoure(id).resource_collection().get() 2014/09/24 APIconUK 2014 55 / 149
  • 56. Adhoc Binding ☺ api = API('http://myrestful/api/v1') # GET /resource api.resource.get() ☹ # GET /resource (with accept header = application/json) api.resource.get(format='json') # GET /resource?attr=value api.resource.get(attr=value) # POST /resource ☹ api.resource.post(attr=value, attr2=value2, ...) # GET /resource/id/resource_collection api.resoure(id).resource_collection().get() 2014/09/24 APIconUK 2014 56 / 149
  • 57. Adhoc Binding ☺ api = API('http://myrestful/api/v1') # GET /resource api.resource.get() # GET /resource (with accept header = application/json) api.resource.get(format='json') # GET /resource?attr=value api.resource.get(attr=value) # POST /resource api.resource.post(attr=value, attr2=value2, ...) # GET /resource/id/resource_collection api.resoure(id).resource_collection().get() 2014/09/24 APIconUK 2014 57 / 149
  • 58. Adhoc Binding ☺ api = API('http://myrestful/api/v1') # GET /resource api.resource.get() # GET /resource (with accept header = application/json) api.resource.get(format='json') # GET /resource?attr=value api.resource.get(attr=value) # POST /resource api.resource.post(attr=value, attr2=value2, ...) # GET /resource/id/resource_collection api.resoure(id).resource_collection().get() ☹ 2014/09/24 APIconUK 2014 58 / 149
  • 59. SDKs 2014/09/24 APIconUK 2014 59 / 149
  • 60. SDKs ● HTTP Clients 2014/09/24 APIconUK 2014 60 / 149
  • 61. SDKs ● HTTP Clients ● REST Clients 2014/09/24 APIconUK 2014 61 / 149
  • 62. SDKs ● HTTP Clients ● REST Clients ● Socket Pools 2014/09/24 APIconUK 2014 62 / 149
  • 63. SDKs ● HTTP Clients ● REST Clients ● Socket Pools ● Request Builders 2014/09/24 APIconUK 2014 63 / 149
  • 64. SDKs ● HTTP Clients ● REST Clients ● Socket Pools ● Request Builders ● URI Concatenators 2014/09/24 APIconUK 2014 64 / 149
  • 65. SDKs ● HTTP Clients ● REST Clients ● Socket Pools ● Request Builders ● URI Concatenators ● OAuth Implementations 2014/09/24 APIconUK 2014 65 / 149
  • 66. SDKs 2014/09/24 APIconUK 2014 66 / 149
  • 67. SDKs ● PHP ● Python ● Ruby ● .NET ● Java ● C, C++ ● Perl ● Android, iOS, Windows Mobile, Blackberry ● Javascript 2014/09/24 APIconUK 2014 67 / 149
  • 69. ctypes >>> from ctypes import * >>> cdll.LoadLibrary("libc.so.6") <CDLL 'libc.so.6', handle 7f408bf8a000 at 21eb8d0> >>> libc = CDLL("libc.so.6") >>> my_printf = libc.printf >>> my_printf("Hello World") Hello World11 >>> my_printf("Hello %s", "Andy") Hello Andy10 2014/09/24 APIconUK 2014 69 / 149
  • 70. ctypes >>> from ctypes import * >>> cdll.LoadLibrary("libc.so.6") <CDLL 'libc.so.6', handle 7f408bf8a000 at 21eb8d0> >>> libc = CDLL("libc.so.6") >>> my_printf = libc.printf >>> my_printf("Hello World") Hello World11 >>> my_printf("Hello %s", "Andy") Hello Andy10 2014/09/24 APIconUK 2014 70 / 149
  • 71. ctypes >>> from ctypes import * >>> cdll.LoadLibrary("libc.so.6") <CDLL 'libc.so.6', handle 7f408bf8a000 at 21eb8d0> >>> libc = CDLL("libc.so.6") >>> my_printf = libc.printf >>> my_printf("Hello World") Hello World11 >>> my_printf("Hello %s", "Andy") Hello Andy10 2014/09/24 APIconUK 2014 71 / 149
  • 72. ctypes >>> from ctypes import * >>> cdll.LoadLibrary("libc.so.6") <CDLL 'libc.so.6', handle 7f408bf8a000 at 21eb8d0> >>> libc = CDLL("libc.so.6") >>> my_printf = libc.printf >>> my_printf("Hello World") Hello World11 >>> my_printf("Hello %s", "Andy") Hello Andy10 2014/09/24 APIconUK 2014 72 / 149
  • 73. ctypes ● Code Loading ● Calling Conventions ● Marshalling ● Memory Models 2014/09/24 APIconUK 2014 73 / 149
  • 74. ● HTTP Implementation ● HTTP Client ● URI / URL Library ● Media Format Libraries 2014/09/24 APIconUK 2014 74 / 149
  • 75. ● HTTP Implementation ● HTTP Client ● URI / URL Library ● Media Format Libraries ● A Way To Put It All Together 2014/09/24 APIconUK 2014 75 / 149
  • 77. Calling Conventions https://api-content.dropbox.com/1/files/auto/<path> https://example.com/price/<date>/<€>/<£> 2014/09/24 APIconUK 2014 77 / 149
  • 78. Calling Conventions https://api-content.dropbox.com/1/files/auto/<path> https://example.com/price/<date>/<€>/<£> 2014/09/24 APIconUK 2014 78 / 149
  • 79. Calling Conventions files(<path>) price(<date>, <€>, <£>) 2014/09/24 APIconUK 2014 79 / 149
  • 80. Calling Conventions https://api.dropbox.com/1/delta?cursor=<x> https://example.com/trades?tick=<n> 2014/09/24 APIconUK 2014 80 / 149
  • 81. Calling Conventions delta(cursor=<x>) trades(tick=<n>) 2014/09/24 APIconUK 2014 81 / 149
  • 82. Calling Conventions https://.../1/revisions/auto/<path>?rev_limit=<y> https://example.com/trades/<stock>?tick=<y> 2014/09/24 APIconUK 2014 82 / 149
  • 83. Calling Conventions revisions(<path>, rev_limit=<y>) trades(<stock>, tick=<y>) 2014/09/24 APIconUK 2014 83 / 149
  • 84. Calling Conventions (define (name pos-arg-1 pos-arg-2 #!key key-arg-1) … result) 2014/09/24 APIconUK 2014 84 / 149
  • 85. Calling Conventions (define (add a b) (+ a b)) 2014/09/24 APIconUK 2014 85 / 149
  • 86. Calling Conventions (define (add a b) (+ a b)) (add 19 47) 2014/09/24 APIconUK 2014 86 / 149
  • 87. Calling Conventions (define (add a b) (+ a b)) (add 19 47) 66 2014/09/24 APIconUK 2014 87 / 149
  • 88. Calling Conventions (define (add a b) (+ a b)) (add 19 47) 66 (define (raise n #!key power) (expt n power)) 2014/09/24 APIconUK 2014 88 / 149
  • 89. Calling Conventions (define (add a b) (+ a b)) (add 19 47) 66 (define (raise n #!key power) (expt n power)) (raise 2 power: 4) 2014/09/24 APIconUK 2014 89 / 149
  • 90. Calling Conventions (define (add a b) (+ a b)) (add 19 47) 66 (define (raise n #!key power) (expt n power)) (raise 2 power: 4) 16 2014/09/24 APIconUK 2014 90 / 149
  • 91. Putting It All Together (use rest-bind) (define-method (procedure-name path-arg... #!key query-arg...) uri-or-request body-writer body-reader #!optional header-reader) 2014/09/24 APIconUK 2014 91 / 149
  • 92. Putting It All Together (use rest-bind) (define-method (procedure-name path-arg... #!key query-arg...) uri-or-request body-writer body-reader #!optional header-reader) 2014/09/24 APIconUK 2014 92 / 149
  • 93. Putting It All Together (use rest-bind) (define-method (procedure-name path-arg... #!key query-arg...) uri-or-request body-writer body-reader #!optional header-reader) 2014/09/24 APIconUK 2014 93 / 149
  • 94. Putting It All Together (use rest-bind) (define-method (procedure-name path-arg... #!key query-arg...) uri-or-request body-writer body-reader #!optional header-reader) 2014/09/24 APIconUK 2014 94 / 149
  • 95. Putting It All Together (use rest-bind) (define-method (procedure-name path-arg... #!key query-arg...) uri-or-request body-writer body-reader #!optional header-reader) 2014/09/24 APIconUK 2014 95 / 149
  • 96. Putting It All Together (use rest-bind) (define-method (procedure-name path-arg... #!key query-arg...) uri-or-request body-writer body-reader #!optional header-reader) 2014/09/24 APIconUK 2014 96 / 149
  • 97. Putting It All Together (use rest-bind) (define-method (procedure-name path-arg... #!key query-arg...) uri-or-request body-writer body-reader #!optional header-reader) 2014/09/24 APIconUK 2014 97 / 149
  • 98. Putting It All Together (use rest-bind) (define-method (procedure-name path-arg... #!key query-arg...) uri-or-request body-writer body-reader #!optional header-reader) 2014/09/24 APIconUK 2014 98 / 149
  • 99. Putting It All Together https://api.dropbox.com/1/account/info 2014/09/24 APIconUK 2014 99 / 149
  • 100. Putting It All Together https://api.dropbox.com/1/account/info (define-method (account/info #!key locale) "https://api.dropbox.com/1/account/info" #f read-json) 2014/09/24 APIconUK 2014 100 / 149
  • 101. Putting It All Together https://api.dropbox.com/1/account/info (define-method (account/info #!key locale) "https://api.dropbox.com/1/account/info" #f read-json) #;> account/info #<procedure (? #!key locale) 2014/09/24 APIconUK 2014 101 / 149
  • 102. Marshalling / Unmarshalling https://api.dropbox.com/1/account/info (define-method (account/info #!key locale) "https://api.dropbox.com/1/account/info" #f read-json) #;> account/info #<procedure (? #!key locale) 2014/09/24 APIconUK 2014 102 / 149
  • 103. Marshalling / Unmarshalling https://api.dropbox.com/1/account/info 2014/09/24 APIconUK 2014 103 / 149
  • 104. Marshalling / Unmarshalling https://api.dropbox.com/1/account/info { "referral_link": "https://www.dropbox.com/referrals/r1a2n3d4m5s6t7", "display_name": "John P. User", "uid": 12345678, "team": { "name": "Acme Inc." }, "country": "US", "quota_info": { "shared": 253738410565, "quota": 107374182400000, "normal": 680031877871 } } 2014/09/24 APIconUK 2014 104 / 149
  • 105. Marshalling / Unmarshalling https://api.dropbox.com/1/account/info ((referral_link . "https://www.dropbox.com/referrals/r1a2n3d4m5s6t7") (display_name . "John P. User") (uid . 12345678) (country . "US") (quota_info (shared . 253738410565) (quota . 107374182400000) (normal . 680031877871))) 2014/09/24 APIconUK 2014 105 / 149
  • 106. Marshalling / Unmarshalling (account/info) 2014/09/24 APIconUK 2014 106 / 149
  • 107. Marshalling / Unmarshalling (account/info) read-string { "referral_link": "https://www.dropbox.com/referrals/r1a2n3d4m5s6t7", "display_name": "John P. User", "uid": 12345678, "team": { "name": "Acme Inc." }, "country": "US", "quota_info": { "shared": 253738410565, "quota": 107374182400000, "normal": 680031877871 } } 2014/09/24 APIconUK 2014 107 / 149
  • 108. Marshalling / Unmarshalling (account/info) read-json ((referral_link . "https://www.dropbox.com/referrals/r1a2n3d4m5s6t7") (display_name . "John P. User") (uid . 12345678) (country . "US") (quota_info (shared . 253738410565) (quota . 107374182400000) (normal . 680031877871))) 2014/09/24 APIconUK 2014 108 / 149
  • 109. Calling Conventions https://example.com/trades/<stock>?tick=<y> (define-method (trades stock #!key tick) "https://examples.com/trades") #f read-json) 2014/09/24 APIconUK 2014 109 / 149
  • 110. Calling Conventions (use rest-bind) (define-method (procedure-name path-arg... #!key query-arg...) uri-or-request body-writer body-reader #!optional header-reader) 2014/09/24 APIconUK 2014 110 / 149
  • 111. Calling Conventions (use rest-bind) (define-method (procedure-name path-arg... #!key query-arg...) uri-or-request body-writer body-reader #!optional header-reader) 2014/09/24 APIconUK 2014 111 / 149
  • 112. Calling Conventions https://example.com/trades/<stock>?tick=<y> (define-method (trades stock #!key tick) "https://examples.com/trades") #f read-json) 2014/09/24 APIconUK 2014 112 / 149
  • 113. Calling Conventions https://example.com/trades/<stock>?tick=<y> (define-method (trades stock #!key tick) "https://examples.com/trades") #f read-json) 2014/09/24 APIconUK 2014 113 / 149
  • 114. Calling Conventions https://example.com/trades/<stock>?tick=<y> (define-method (trades stock #!key tick) (make-request method: 'PUT uri: (uri-reference: "https://examples.com/trades") #f read-json) 2014/09/24 APIconUK 2014 114 / 149
  • 115. Calling Conventions https://example.com/trades/<stock>?tick=<y> (define-method (trades stock #!key tick) (make-request method: 'PUT uri: (uri-reference: "https://examples.com/trades") headers: '(accept #(application/json ((q . 0.5))))) #f read-json) 2014/09/24 APIconUK 2014 115 / 149
  • 116. Putting It All Together (trades 'LON:TSCO tick: 3) 2014/09/24 APIconUK 2014 116 / 149
  • 117. Putting It All Together (trades 'LON:TSCO tick: 3) ((1411602130 . 19490 1411602133 . +6 1411602136 . +1 1411602139 . -2 1411602142 . +3 1411602145 . +1 1411602148 . -2 1411602151 . -1 1411602154 . 0 1411602157 . +1)) 2014/09/24 APIconUK 2014 117 / 149
  • 118. ● HTTP Implementation ● HTTP Client ● URI / URL Library ● Media Format Libraries ● A Way To Put It All Together 2014/09/24 APIconUK 2014 118 / 149
  • 119. ● HTTP Implementation ● HTTP Client ● URI / URL Library ● Media Format Libraries ● A Way To Put It All Together 2014/09/24 APIconUK 2014 119 / 149
  • 120. ● HTTP Implementation ● HTTP Client ● URI / URL Library ● Media Format Libraries ● A Way To Put It All Together 66 lines 2014/09/24 APIconUK 2014 120 / 149
  • 121. Putting It All Together (module dropbox-lolevel (dropbox make-dropbox-app account/info files:get files:put files:post metadata delta revisions restore search shares media copy-ref thumbnails chunked_upload commit_chunked_upload fileops/copy fileops/create_folder fileops/delete fileops/move callback old-output-port) 2014/09/24 APIconUK 2014 121 / 149
  • 122. oauth Dropbox 2014/09/24 APIconUK 2014 122 / 149
  • 123. oauth Dropbox A User 2014/09/24 APIconUK 2014 123 / 149
  • 124. oauth Dropbox A User Knodium 2014/09/24 APIconUK 2014 124 / 149
  • 125. oauth Dropbox A User Knodium 2014/09/24 APIconUK 2014 125 / 149
  • 126. oauth Dropbox A User Knodium 2014/09/24 APIconUK 2014 126 / 149
  • 127. oauth Dropbox A User Knodium 2014/09/24 APIconUK 2014 127 / 149
  • 128. oauth Dropbox A User Knodium 2014/09/24 APIconUK 2014 128 / 149
  • 129. oauth Dropbox A User Knodium 2014/09/24 APIconUK 2014 129 / 149
  • 130. oauth Dropbox A User Knodium 2014/09/24 APIconUK 2014 130 / 149
  • 131. oauth Dropbox A User Knodium 2014/09/24 APIconUK 2014 131 / 149
  • 132. oauth Dropbox A User Knodium 2014/09/24 APIconUK 2014 132 / 149
  • 133. oauth Dropbox A User Knodium 2014/09/24 APIconUK 2014 133 / 149
  • 134. oauth Dropbox A User Knodium 2014/09/24 APIconUK 2014 134 / 149
  • 135. oauth Dropbox A User Knodium 2014/09/24 APIconUK 2014 135 / 149
  • 136. oauth Dropbox A User Knodium 2014/09/24 APIconUK 2014 136 / 149
  • 137. oauth (use oauth-client) (define dropbox (make-oauth-service-provider protocol-version: 1.0 credential-request-url: "https://api.dropbox.com/1/oauth/request_token" owner-auth-url: "https://www.dropbox.com/1/oauth/authorize" token-request-url: "https://api.dropbox.com/1/oauth/access_token" signature-method: 'plaintext)) 2014/09/24 APIconUK 2014 137 / 149
  • 138. (use oauth-client) (define dropbox-app (make-oauth-service oauth service: dropbox client-credential: (make-oauth-credential "<token>" "<secret>"))) 2014/09/24 APIconUK 2014 138 / 149
  • 139. oauth Dropbox A User Knodium 2014/09/24 APIconUK 2014 139 / 149
  • 140. Putting it all together (with-oauth <app> <credential> ...) 2014/09/24 APIconUK 2014 140 / 149
  • 141. Putting it all together (account/info) 2014/09/24 APIconUK 2014 141 / 149
  • 142. Putting it all together (with-oauth <app> <credential> (account/info)) 2014/09/24 APIconUK 2014 142 / 149
  • 143. Putting it all together (account/info) 2014/09/24 APIconUK 2014 143 / 149
  • 144. Putting it all together (account/info) 2014/09/24 APIconUK 2014 144 / 149
  • 145. Putting it all together (display-name) (account/info) 2014/09/24 APIconUK 2014 145 / 149
  • 146. Putting it all together (web-page-logic) (display-name) (account/info) 2014/09/24 APIconUK 2014 146 / 149
  • 147. Putting it all together (request-routing) (web-page-logic) (display-name) (account/info) 2014/09/24 APIconUK 2014 147 / 149
  • 148. Putting it all together (with-oauth <app> <credential>) (request-routing) (web-page-logic) (display-name) (account/info) 2014/09/24 APIconUK 2014 148 / 149
  • 149. ? 2014/09/24 APIconUK 2014 149 / 149
  • 151. URIs & URLs Are Not Strings https://example.com/price/<x> 2014/09/24 APIconUK 2014 151 / 149
  • 152. URIs & URLs Are Not Strings https://example.com/price/<x>?tick=<n> 2014/09/24 APIconUK 2014 152 / 149
  • 153. URIs & URLs Are Not Strings https://example.com/price/<x>?tick=<n> 2014/09/24 APIconUK 2014 153 / 149
  • 154. URIs & URLs Are Not Strings https://example.com/price/<x>?tick=<n> 2014/09/24 APIconUK 2014 154 / 149
  • 155. URIs & URLs Are Not Strings https://example.com/price/<x>?tick=<n> https://example.com/price/<x>/<y> 2014/09/24 APIconUK 2014 155 / 149
  • 156. URIs & URLs Are Not Strings https://example.com/price/<x>/<y>?tick=<n> 2014/09/24 APIconUK 2014 156 / 149
  • 157. URIs & URLs Are Not Strings https://user:pass@example.com/price?tick=3#appendix 2014/09/24 APIconUK 2014 157 / 149
  • 158. URIs & URLs Are Not Strings https://user:pass@example.com/price?tick=3#appendix 2014/09/24 APIconUK 2014 158 / 149
  • 159. URIs & URLs Are Not Strings https://user:pass@example.com/price?tick=3#appendix 2014/09/24 APIconUK 2014 159 / 149
  • 160. URIs & URLs Are Not Strings https://user:pass@example.com/price?tick=3#appendix 2014/09/24 APIconUK 2014 160 / 149
  • 161. URIs & URLs Are Not Strings https://user:pass@example.com/price?tick=3#appendix 2014/09/24 APIconUK 2014 161 / 149
  • 162. URIs & URLs Are Not Strings https://user:pass@example.com/price?tick=3#appendix 2014/09/24 APIconUK 2014 162 / 149
  • 163. URIs & URLs Are Not Strings https://user:pass@example.com/price?tick=3#appendix 2014/09/24 APIconUK 2014 163 / 149
  • 164. URIs & URLs Are Not Strings https://user:pass@example.com/price?tick=3#appendix 2014/09/24 APIconUK 2014 164 / 149
  • 165. URIs & URLs Are Not Strings https://user:pass@example.com/price?tick=3#appendix ftp://example.com //example.com/resource //example.com /book ?length=17;width=19 ?depth=21&height=29#glossary #chapter1 2014/09/24 APIconUK 2014 165 / 149
  • 166. URIs & URLs Are Not Strings https://user:pass@example.com/price?tick=3#appendix ftp://example.com //example.com/resource //example.com /book ?length=17;width=19 ?depth=21&height=29#glossary #chapter1 2014/09/24 APIconUK 2014 166 / 149