123456789_123456789_123456789_123456789_123456789_

Class: GraphQL::Client::HTTP

Relationships & Source Files
Inherits: Object
Defined in: lib/graphql/client/http.rb

Overview

Public: Basic HTTP network adapter.

GraphQL::Client.new(
  execute: GraphQL::Client::HTTP.new("http://graphql-swapi.parseapp.com/")
)

Assumes GraphQL endpoint follows the express-graphql endpoint conventions. github.com/graphql/express-graphql#http-usage

Production applications should consider implementing there own network adapter. This class exists for trivial stock usage and allows for minimal request header configuration.

Class Method Summary

Instance Attribute Summary

  • #uri readonly

    Public: Parsed endpoint URI.

Instance Method Summary

Constructor Details

.new(uri, &block) ⇒ HTTP

Public: Create HTTP adapter instance for a single ::GraphQL endpoint.

GraphQL::Client::HTTP.new("http://graphql-swapi.parseapp.com/") do
  def headers(context)
    { "User-Agent": "My Client" }
  end
end

uri - String endpoint URI block - Optional block to configure class

[ GitHub ]

  
# File 'lib/graphql/client/http.rb', line 31

def initialize(uri, &block)
  @uri = URI.parse(uri)
  singleton_class.class_eval(&block) if block_given?
end

Instance Attribute Details

#uri (readonly)

Public: Parsed endpoint URI

Returns URI.

[ GitHub ]

  
# File 'lib/graphql/client/http.rb', line 39

attr_reader :uri

Instance Method Details

#connection

Public: Extension point for subclasses to customize the Net:HTTP client

Returns a Net::HTTP object

[ GitHub ]

  
# File 'lib/graphql/client/http.rb', line 85

def connection
  Net::HTTP.new(uri.host, uri.port).tap do |client|
    client.use_ssl = uri.scheme == "https"
  end
end

#execute(document:, operation_name: nil, variables: {}, context: {})

Public: Make an HTTP request for ::GraphQL query.

Implements Client’s “execute” adapter interface.

document - The Query GraphQL::Language::Nodes::Document operation_name - The String operation definition name variables - Hash of query variables context - An arbitrary Hash of values which you can access

Returns { “data” => … , “errors” => … } Hash.

[ GitHub ]

  
# File 'lib/graphql/client/http.rb', line 58

def execute(document:, operation_name: nil, variables: {}, context: {})
  request = Net::HTTP::Post.new(uri.request_uri)

  request.basic_auth(uri.user, uri.password) if uri.user || uri.password

  request["Accept"] = "application/json"
  request["Content-Type"] = "application/json"
  headers(context).each { |name, value| request[name] = value }

  body = {}
  body["query"] = document.to_query_string
  body["variables"] = variables if variables.any?
  body["operationName"] = operation_name if operation_name
  request.body = JSON.generate(body)

  response = connection.request(request)
  case response
  when Net::HTTPOK, Net::HTTPBadRequest
    JSON.parse(response.body)
  else
    { "errors" => [{ "message" => "#{response.code} #{response.message}" }] }
  end
end

#headers(_context)

Public: Extension point for subclasses to set custom request headers.

Returns Hash of String header names and values.

[ GitHub ]

  
# File 'lib/graphql/client/http.rb', line 44

def headers(_context)
  {}
end