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
Public: Parsed endpoint URI
Returns URI.
Public Class Methods
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
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
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
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