Class: GraphQL::Client::HTTP

Inherits:
Object
  • Object
show all
Defined in:
lib/graphql/client/http.rb

Overview

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.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(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



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

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

Instance Attribute Details

#uriObject (readonly)

Public: Parsed endpoint URI

Returns URI.



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

def uri
  @uri
end

Instance Method Details

#connectionObject

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

Returns a Net::HTTP object



82
83
84
85
86
# File 'lib/graphql/client/http.rb', line 82

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: {}) ⇒ Object

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.



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/graphql/client/http.rb', line 57

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

  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) ⇒ Object

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

Returns Hash of String header names and values.



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

def headers(_context)
  {}
end