class GraphQL::Client::HTTP

Public: Basic HTTP network adapter.

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

Assumes GraphQL endpoint follows the express-graphql endpoint conventions.

https://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.

Attributes

uri[R]

Public: Parsed endpoint URI

Returns URI.

Public Class Methods

new(uri, &block) click to toggle source

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

# 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

Public Instance Methods

connection() click to toggle source

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

Returns a Net::HTTP object

# 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: {}) click to toggle source

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.

# 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) click to toggle source

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

Returns Hash of String header names and values.

# File lib/graphql/client/http.rb, line 44
def headers(_context)
  {}
end