Hey there, fellow Ruby enthusiast! Ready to dive into the world of Apollo API integration? You're in for a treat. Apollo's GraphQL API is a powerhouse, and we're about to harness that power in our Ruby projects. Let's get cracking!
Before we jump in, make sure you've got:
apollo-client
gem (we'll install it soon)First things first, let's get our project off the ground:
mkdir apollo_integration cd apollo_integration bundle init
Now, let's add the necessary gems to our Gemfile
:
gem 'apollo-client' gem 'httparty'
Run bundle install
, and we're ready to rock!
Time to set up our Apollo client. Create a new file called apollo_client.rb
:
require 'apollo-client' class ApolloClient def initialize @client = Apollo::Client.new( uri: 'https://api.apollo.io/v1/graphql', headers: { 'X-API-Key' => ENV['APOLLO_API_KEY'] } ) end attr_reader :client end
Pro tip: Use environment variables for your API key. Security first!
Now for the fun part – let's make some requests!
query = <<~GRAPHQL query { people(first: 10) { edges { node { name email } } } } GRAPHQL result = apollo_client.client.query(query) puts result.data.people.edges.map { |e| e.node.name }
mutation = <<~GRAPHQL mutation($input: CreatePersonInput!) { createPerson(input: $input) { person { name email } } } GRAPHQL variables = { input: { name: "Ruby Rockstar", email: "[email protected]" } } result = apollo_client.client.mutation(mutation, variables: variables) puts result.data.create_person.person.name
Apollo's responses are pretty neat, but let's make them even better:
def handle_response(result) if result.errors.any? puts "Oops! We hit a snag: #{result.errors.map(&:message).join(', ')}" else yield result.data end end handle_response(result) do |data| puts data.people.edges.map { |e| e.node.name } end
Apollo's got your back with cursor-based pagination:
query = <<~GRAPHQL query($after: String) { people(first: 10, after: $after) { pageInfo { hasNextPage endCursor } edges { node { name } } } } GRAPHQL cursor = nil loop do result = apollo_client.client.query(query, variables: { after: cursor }) handle_response(result) do |data| data.people.edges.each { |e| puts e.node.name } break unless data.people.page_info.has_next_page cursor = data.people.page_info.end_cursor end end
The apollo-client
gem handles caching out of the box. You're welcome!
Let's write a quick test to make sure everything's working:
require 'minitest/autorun' require 'webmock/minitest' class ApolloIntegrationTest < Minitest::Test def setup @client = ApolloClient.new end def test_query_people stub_request(:post, "https://api.apollo.io/v1/graphql") .to_return(status: 200, body: '{"data":{"people":{"edges":[{"node":{"name":"Test User"}}]}}}') query = 'query { people(first: 1) { edges { node { name } } } }' result = @client.client.query(query) assert_equal "Test User", result.data.people.edges.first.node.name end end
And there you have it! You've just built a solid Apollo API integration in Ruby. Remember, this is just the beginning – there's so much more you can do with Apollo's powerful API. Keep exploring, keep coding, and most importantly, keep having fun with Ruby!
Happy coding, Rubyist! 🚀💎