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


31
32
33
34
# 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

#uriObject (readonly)

Public: Parsed endpoint URI

Returns URI.


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

def uri
  @uri
end

Instance Method Details

#connectionObject

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

Returns a Net::HTTP object


85
86
87
88
89
# 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: {}) ⇒ 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.


58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# 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) ⇒ Object

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

Returns Hash of String header names and values.


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

def headers(_context)
  {}
end