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.
54. 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 => "..."
end
end
55. 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
end
end
56. 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
end
end