API-Entwicklung       bei XING      Mark Schmidt
XING?Bestehende APIsSchritte zu einer guten API
?
Technologie-Department
rdwareHa
Software
Bestehende APIs
Interne APIs:
YAML HTTP API / Perl Backend
Gearman
gemeinsam genutzte Datenbanken
SSH
FTP
AMQP / RabbitMQ
REST-APIs
Externe APIs:
XWS 1
XWS+
SOAP-Schnittstelle für Payment
(+ kleine Insellösungen)
das (externe) API-Team
Schritte zu einer guten API                       Schritte zu einer                          guten API
Warum ist API-Design wichtig?
Gute API?→ J.Bloch, How to Design a Good API and Why it Matters, 2006
Einfach zu erlernen→ J.Bloch, How to Design a Good API and Why it Matters, 2006
Einfach zu benutzen, auch    ohne Dokumentation→ J.Bloch, How to Design a Good API and Why it Matters, 2006
Lässt sich nur schwer falsch             benutzen→ J.Bloch, How to Design a Good API and Why it Matters, 2006
Client-Code ist gut les- und              wartbar→ J.Bloch, How to Design a Good API and Why it Matters, 2006
Ausreichend mächtig→ J.Bloch, How to Design a Good API and Why it Matters, 2006
Einfach zu erweitern→ J.Bloch, How to Design a Good API and Why it Matters, 2006
Geeignet für die Zielgruppe→ J.Bloch, How to Design a Good API and Why it Matters, 2006
Probleme... Fragen... Lösungen?
REST!
REpresentationalStateTransfer!→ R. Fielding, Architectural Styles and the Design of Network-based Software Architectures ,...
Response-Format
GET https://api.xing.com/v1/users/123456_abcdef/contacts/upcoming_birthdays?limit=3&offset=0                     {        ...
Status-Codes
200, 201, 204
400, 401, 403, 404, 405
(500, ) 503
∀ > 400 : {JSON,XML}
{    "error_name": "INVALID_OAUTH_TOKEN",    "message": "Invalid OAuth token",    "revoke_reason": "PASSWORD_CHANGED"}
API-Domäne != Produkt-Domäne
intern:                    Module	  namespace/rest/newsfeed/activitystream/:user_idREST	  API	  namespace                 ...
Versionierung
GET api.xing.com/users/123?version=1                    vs.     GET api.xing.com/v1/users/123                    vs.      ...
Hinzufügen neuer Calls? Kein     Problem, aber...
Call-Lifecycle
Eingabe       ⤻    Ausgabe
KISS
module WebService  class CommentsController < WebService::ServiceController    add_call :name => Get comments of an activi...
module WebService::Handlers  class CommentsHandler < WebService::Handlers::Base    include WebService::Handlers::Helpers  ...
ActionController::Routing::Routes.draw do |map|  map.namespace(:web_service, :path_prefix => v1) do |v1|    v1.resources :...
Oauth für Partnerintegrationen?
Wie geht‘s weiter?
Noch 2 Punkte in eigener Sache:
api@xing.com
Product Owner            Ruby Developer             Perl DeveloperQuality Assurance Manager        Frontend Developer     ...
API-Entwicklung bei XING
API-Entwicklung bei XING
API-Entwicklung bei XING
API-Entwicklung bei XING
Upcoming SlideShare
Loading in …5
×

API-Entwicklung bei XING

2,931 views

Published on

Wie für viele andere Plattformen, so ist auch für XING die Öffnung der Rechenzentrumsgrenzen mit Hilfe von externen APIs, z.B. zur Partnerintegration, ein wichtiges Thema. In diesem Vortrag werfen wir einen Blick auf die Interna der (API-)Entwicklung bei XING: Architektur der Plattform, Historie der verschiedenen APIs, Entwicklungsprozesse, best practices beim API-Design, enge Zusammenarbeit mit einzelnen Consumern sowie (rechtliche) Herausforderungen bei der Datenweitergabe via API.

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,931
On SlideShare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
0
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

API-Entwicklung bei XING

  1. 1. API-Entwicklung bei XING Mark Schmidt
  2. 2. XING?Bestehende APIsSchritte zu einer guten API
  3. 3. ?
  4. 4. Technologie-Department
  5. 5. rdwareHa
  6. 6. Software
  7. 7. Bestehende APIs
  8. 8. Interne APIs:
  9. 9. YAML HTTP API / Perl Backend
  10. 10. Gearman
  11. 11. gemeinsam genutzte Datenbanken
  12. 12. SSH
  13. 13. FTP
  14. 14. AMQP / RabbitMQ
  15. 15. REST-APIs
  16. 16. Externe APIs:
  17. 17. XWS 1
  18. 18. XWS+
  19. 19. SOAP-Schnittstelle für Payment
  20. 20. (+ kleine Insellösungen)
  21. 21. das (externe) API-Team
  22. 22. Schritte zu einer guten API Schritte zu einer guten API
  23. 23. Warum ist API-Design wichtig?
  24. 24. Gute API?→ J.Bloch, How to Design a Good API and Why it Matters, 2006
  25. 25. Einfach zu erlernen→ J.Bloch, How to Design a Good API and Why it Matters, 2006
  26. 26. Einfach zu benutzen, auch ohne Dokumentation→ J.Bloch, How to Design a Good API and Why it Matters, 2006
  27. 27. Lässt sich nur schwer falsch benutzen→ J.Bloch, How to Design a Good API and Why it Matters, 2006
  28. 28. Client-Code ist gut les- und wartbar→ J.Bloch, How to Design a Good API and Why it Matters, 2006
  29. 29. Ausreichend mächtig→ J.Bloch, How to Design a Good API and Why it Matters, 2006
  30. 30. Einfach zu erweitern→ J.Bloch, How to Design a Good API and Why it Matters, 2006
  31. 31. Geeignet für die Zielgruppe→ J.Bloch, How to Design a Good API and Why it Matters, 2006
  32. 32. Probleme... Fragen... Lösungen?
  33. 33. REST!
  34. 34. REpresentationalStateTransfer!→ R. Fielding, Architectural Styles and the Design of Network-based Software Architectures , 2000
  35. 35. Response-Format
  36. 36. GET https://api.xing.com/v1/users/123456_abcdef/contacts/upcoming_birthdays?limit=3&offset=0 { "upcoming_birthdays": { "total": 34, "items": [{ "user": {"id": "52313245_52f7g0"}, "day": 20, "month": 10, "year": 1980 }, { "user": {"id": "78787878_12h4g2"}, "day": 22, "month": 10, "year": 1965 }, { "user": {"id": "3453245_h190cx"}, "day": 23, "month": 10, "year": null }] } }
  37. 37. Status-Codes
  38. 38. 200, 201, 204
  39. 39. 400, 401, 403, 404, 405
  40. 40. (500, ) 503
  41. 41. ∀ > 400 : {JSON,XML}
  42. 42. { "error_name": "INVALID_OAUTH_TOKEN", "message": "Invalid OAuth token", "revoke_reason": "PASSWORD_CHANGED"}
  43. 43. API-Domäne != Produkt-Domäne
  44. 44. intern: Module  namespace/rest/newsfeed/activitystream/:user_idREST  API  namespace Module  Resourcesextern:/v1/users/:user_id/network_feed
  45. 45. Versionierung
  46. 46. GET api.xing.com/users/123?version=1 vs. GET api.xing.com/v1/users/123 vs. GET api.xing.com/users/123Accept: application/vnd.xing.user-v1+json
  47. 47. Hinzufügen neuer Calls? Kein Problem, aber...
  48. 48. Call-Lifecycle
  49. 49. Eingabe ⤻ Ausgabe
  50. 50. KISS
  51. 51. module WebService class CommentsController < WebService::ServiceController add_call :name => Get comments of an activity, :description => "Returns a list of all comments which have been made for an activity.", :status => :experimental, :experimental_since => 2011-05-02, :action => index, :permission => :activity_stream, :required_parameters => { "activity_id" => "Activity ID" }, :optional_parameters => { limit => "How many comments to return. Must be a positive number. Default: 10", "offset" => "Offset. Must be a positive number. Default: 0", "user_fields" => "Comma separated list of user attributes to return..." }, :returns => { :success => {:code => 200, :message => The call was completed successfully}, :invalid_parameters => {:code => 403, :message => ..., :error => INVALID_PARAMETERS}, :access_denied => {:code => 403, :message => ..., :error => ACCESS_DENIED}, :activity_not_found => {:code => 404, :message => ..., :error => ACTIVITY_NOT_FOUND} }, :response_example => "..." endend
  52. 52. module WebService::Handlers class CommentsHandler < WebService::Handlers::Base include WebService::Handlers::Helpers def index(params) activity = find_activity!(params[:activity_id], :rid => User.current.id) limit, offset = pagination_params!(params[:limit], params[:offset]) result = { :comments => [] } if activity[:comments].any? && activity[:comments].size > offset user_fields = filter_user_fields(params[:user_fields]) result[:comments] = ActivityStream::Comment.build(activity[:comments], :user_fields => user_fields)[offset, limit] end result rescue ResourceNotFoundError :activity_not_found rescue InvalidParameterError => e [:invalid_parameters, {:message => e.message}] rescue AccessDeniedError :access_denied end endend
  53. 53. ActionController::Routing::Routes.draw do |map| map.namespace(:web_service, :path_prefix => v1) do |v1| v1.resources :activities do |activities| activities.resources :comments, :only => [:index] end endend
  54. 54. Oauth für Partnerintegrationen?
  55. 55. Wie geht‘s weiter?
  56. 56. Noch 2 Punkte in eigener Sache:
  57. 57. api@xing.com
  58. 58. Product Owner Ruby Developer Perl DeveloperQuality Assurance Manager Frontend Developer Interaction Designer ... XING sucht neue Kollegen!

×