ABCDEFGHI
1
(Speculative circa Mar 2014; not a commitment)
2
ServiceHighrise/37SignalsSalesforce/Force.comGithubDrupal 8Civi APIv3Civi 5.0 (Ideal)Civi 5.0 (Preview)Civi 5.0 (Early/Mid-Mar)
3
General: DescriptionCRM-focused REST API. Consumer-oriented docs.Customizable datastore with REST API. Consumer-oriented docs.Git-focused REST API. Consumer-oriented docs.Customizable datastore with REST API. Provider-oriented docs.
4
General: Doc URLhttps://github.com/basecamp/highrise-apihttps://www.salesforce.com/us/developer/docs/api_rest/http://developer.github.com/v3/
5
Formats: API VersioningNoneDiff REST URLs per versionHeader (Accept:)NoneQuery param (?version=)??None
6
Formats: Media TypesXMLJSON, XMLJSON{JSON,XML}{,HAL}; extendableJSON,XMLJSON,XMLJSON,XMLJSON,XML
7
Formats: Media Type SignalingURL-ext (“.xml”)Header("Accept:") or URL-ext (“.xml”)NoneHeader (Accept:)Query param (?json=)Header ("Accept:") or query param (?_format=)Header ("Accept:") or query param (?_format=)Header ("Accept:") or query param (?_format=)
8
Formats: Pretty PrintingNo(?)Header (X-PrettyPrint:)No(?)?NoParam (?_pretty=true)NoNo
9
Formats: Mutator ResponsesFull data (with ?reload=true)Summary data (id/errors)Summary data (errors)?Inconsistent unless options.reload=trueFull data (with ?_return=true)Full data (with ?_return=true)Summary data (errors, plain-text)
10
Authn: OAuth2YesYesYesYesNoYesNoNo
11
Authn: HTTP Basic AuthNoNoYesYesNoYesNoNo
12
Authn: OtherCustom token (retrievable with user+pass)ExtendableCMS session; custom-tokenCMS session; custom-token; extendableCMS sessionCMS session
13
Authz: Entity-level?Yes(?)NoYesYesYesYesYes
14
Authz: Field-levelNoYes(?)NoPartial (“Views”)Partial (ACLs+Profiles)Partial (ACLs+Profiles)NoNo
15
Authz: Record-levelYesYes(?)YesNo (Extendable)Partial (ACLs; Extendable)Partial (ACLs; Extendable)Partial (ACLs; Extendable)No (Extendable)
16
Verbs: GETReadReadReadReadReadReadReadRead
17
Verbs: POSTCreate-onlyCreate; Verb emulation (?HttpMethod)Create; Update; Custom-actionsCreateAny actionCreate; UpdateCreate; UpdateCreate; Update
18
Verbs: PUTUpdate (with “-123” to unset)NoReplaceNoNoReplaceNoNo
19
Verbs: PATCHNoUpdate (Bare JSON)Update (Bare JSON)Update (Bare JSON)NoUpdate (Bare JSON; x-www-form; JSON-Patch)Update (Bare JSON)Update (Bare JSON)
20
Verbs: DELETEDeleteDeleteDeleteDeleteNoDeleteDeleteDelete
21
Schema: ReflectionNoYes (“sobject” resource)No?Yes (“getfields”)Yes (JSON Schema)Yes (JSON Schema)No
22
Schema: UINo?NoPartial (Field + Views Admin not REST-aware; restui not field-aware)Yes (API Explorer)Yes (JSON Editor)NoNo
23
Schema: DocsYesNoYesNoNoYesNoNo
24
Schema: Docs: ExamplesYesNoYesNoYesYesNoNo
25
Get: FiltersQuery Param (“&criteria[state]=CA”)Single-field (in path) or complex (filtered SOQL)Yes (With Views REST)Query param or JSON paramQuery Param; Complex Query (Filtered DQL)Query paramQuery param
26
Get: Specify Return Values?YesNo, but diff btwn “Summary” and “Detail” representationsNo(?), but Views allows diff representationsYes (Properties, Chaining)Yes (Properties, HAL Relations)Yes (HAL Relations)No
27
Get: Other commentsSupport for “content” and “views” (saved queries).
28
Relations (Contact<->Email/Phone, Read)Embedded?Sub-resource (collection item)FK(id) + Views + HAL(?)FK (id) + ChainingFK (id) + HALFK (id) + HAL
29
Relations (Contact<->Email/Phone, Write)Embedded. If specified, replaces old list?Sub-resource (collection item)FK(id)FK (id) + ChainingFK (id) + HAL. If HAL specified, replaces old listFK (id) + HAL. If HAL specified, replaces old list
30
Relations (Contact<->Activity, Read)FK (id)?Embedded (“Summary”, with id+username+urls)FK(id) + Views + HAL(?)FK (id) + ChainingFK (id) + HALFK (id) + HAL
31
Relations (Contact<->Activity, Write)FK (id)?Username stringFK(id)FK (id) + ChainingFK (id)FK (id)
32
Relations (Contact<->Custom Data)Embedded <subject-data>Native-likeNoneNative-likecustom_123 (sometimes); CustomValue (anytime).HAL (SV/MV); Entities (MV)?None
33
Cross-Site: CORS?No (requested/speculated)Yes (Registered OAuth links)?NoYesNoNo
34
Cross-Site: JSON-P?Yes (with authtoken)Yes (for GET)?NoMaybe (With special token handling)NoNo
35
Cross-Site: crossdomain.xml?YesNo(?? - master-only + empty)?NoYesNoNo
36
Batch OperationsNo(?)No(?)No(?)No(?)Yes (chaining & batching)“Batch” resource; HAL relations?No
37
Sane Option Values (eg country "1228" vs "us")YesYes (Partial?)Yes?No
38
Optimistic locking????NoYes?No
39
Multilingual????YesYes?No
40
Other NotesRequires User-Agent(?) Consolidated request lifecycle for REST/HTML/formsAll *options* should work as headers (“X-PrettyPrint:”), query params with “_” prefix (“?_pretty=1”), or embeds ({_options:{pretty:true}}})All *options* should work as headers (“X-PrettyPrint:”), query params with “_” prefix (“?_pretty=1”), or embeds ({_options:{pretty:true}}})
41
Resource Type: Contact / Person / Org / Email / Phone / AddressYesYesYesYesYesYesYesPartial
42
Resource Type: Activity / Participant / Contribution / MembershipYesYesN/A (Comparable)N/A (Extendable)YesYesYesPartial
43
Resource Type: ReportNo?NoYes (Views)YesYesYesNo
44
Resource Type: Custom FieldsYes?No?YesYesYesPartial
45
Subjective: Coolest Feature (Tim's opinion)Predictable. Clear docs.SOQL. Field-level security.Cross-site (browser-based) integrationsViews; Extensibility; Consolidated request lifecycleChaining. REST+JS+PHP+Smarty+Drush
46
Subjective: Biggest Liability (Tim's opinion)Old RESTful interface (eg XML+POST); not like the Cool New RESTful (eg JSON+PUT/PATCH)Data model depends on site. Hard to document.Data model depends on site. Hard to document. Moving target following the cool kids.BAOs. Old RESTy interface. Unusual authentication.