在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称(OpenSource Name):graphql-crystal/graphql开源软件地址(OpenSource Url):https://github.com/graphql-crystal/graphql开源编程语言(OpenSource Language):Crystal 99.6%开源软件介绍(OpenSource Introduction):GraphQL server library for Crystal.
Getting StartedInstall the shard by adding the following to our dependencies:
graphql:
github: graphql-crystal/graphql Then run The first step is to define a query object. This is the root type for all queries and it looks like this: require "graphql"
@[GraphQL::Object]
class Query < GraphQL::BaseQuery
@[GraphQL::Field]
def hello(name : String) : String
"Hello, #{name}!"
end
end Now we can create a schema object: schema = GraphQL::Schema.new(Query.new) To verify we did everything correctly, we can print out the schema: puts schema.document.to_s Which, among several built-in types, prints our query type: type Query {
hello(name: String!): String!
} To serve our API over HTTP we call post "/graphql" do |env|
env.response.content_type = "application/json"
query = env.params.json["query"].as(String)
variables = env.params.json["variables"]?.as(Hash(String, JSON::Any)?)
operation_name = env.params.json["operationName"]?.as(String?)
schema.execute(query, variables, operation_name)
end Now we're ready to query our API: curl \
-X POST \
-H "Content-Type: application/json" \
--data '{ "query": "{ hello(name: \"John Doe\") }" }' \
http://0.0.0.0:3000/graphql This should return: { "data": { "hello": "Hello, John Doe!" } } For easier development, we recommend using GraphiQL. A starter template combining Kemal and GraphiQL is found at examples/graphiql. Context
# Define our own context type
class MyContext < GraphQL::Context
@pi : Float64
def initialize(@pi)
end
end
# Pass it to schema.execute
context = MyContext.new(Math.PI)
schema.execute(query, variables, operation_name, context)
# Access it in our fields
@[GraphQL::Object]
class MyMath < GraphQL::BaseObject
@[GraphQL::Field]
def pi(context : MyContext) : Float64
context.pi
end
end Context instances must not be reused for multiple executions. ObjectsObjects are perhaps the most commonly used type in GraphQL. They are implemented
as classes. To define a object, we need a @[GraphQL::Object]
class Foo < GraphQL::BaseObject
# type restrictions are mandatory on fields
@[GraphQL::Field]
def hello(first_name : String, last_name : String) : String
"Hello #{first_name} #{last_name}"
end
# besides basic types, we can also return other objects
@[GraphQL::Field]
def bar : Bar
Bar.new
end
end
@[GraphQL::Object]
class Bar < GraphQL::BaseObject
@[GraphQL::Field]
def baz : Float64
42_f64
end
end For simple objects, we can use instance variables: @[GraphQL::Object]
class Foo < GraphQL::BaseObject
@[GraphQL::Field]
property bar : String
@[GraphQL::Field]
getter baz : Float64
end QueryQuery is the root type of all queries. @[GraphQL::Object]
class Query < GraphQL::BaseQuery
@[GraphQL::Field]
def echo(str : String) : String
str
end
end
schema = GraphQL::Schema.new(Query.new) MutationMutation is the root type for all mutations. @[GraphQL::Object]
class Mutation < GraphQL::BaseMutation
@[GraphQL::Field]
def echo(str : String) : String
str
end
end
schema = GraphQL::Schema.new(Query.new, Mutation.new) Input ObjectsInput objects are objects that are used as field arguments. To define an input
object, use a @[GraphQL::InputObject]
class User < GraphQL::BaseInputObject
getter first_name : String?
getter last_name : String?
@[GraphQL::Field]
def initialize(@first_name : String?, @last_name : String?)
end
end EnumsDefining enums is straightforward. Just add a @[GraphQL::Enum]
enum IPAddressType
IPv4
IPv6
end ScalarsThe following scalar values are supported:
Built-in custom scalars:
Custom scalars are created by implementing from_json/to_json: @[GraphQL::Scalar]
class ReverseStringScalar < GraphQL::BaseScalar
@value : String
def initialize(@value)
end
def self.from_json(string_or_io)
self.new(String.from_json(string_or_io).reverse)
end
def to_json(builder : JSON::Builder)
builder.scalar(@value.reverse)
end
end InterfacesInterfaces are not supported. SubscriptionsSubscriptions are not supported. Annotation ArgumentsnameSupported on: We can use the @[GraphQL::Object(name: "Sheep")]
class Wolf
@[GraphQL::Field(name: "baa")]
def howl : String
"baa"
end
end descriptionSupported on: Describes the type. Descriptions are available through the introspection interface so it's always a good idea to set this argument. @[GraphQL::Object(description: "I'm a sheep, I promise!")]
class Wolf
end deprecatedSupported on: The deprecated argument marks a type as deprecated. class Sheep
@[GraphQL::Field(deprecated: "This was a bad idea.")]
def fight_wolf : String
"Wolf ate sheep"
end
end argumentsSets names and descriptions for field arguments. Note that arguments cannot be marked as deprecated. class Sheep
@[GraphQL::Field(arguments: {weapon: {name: "weaponName", description: "The weapon the sheep should use."}})]
def fight_wolf(weapon : String) : String
if weapon == "Atomic Bomb"
"Sheep killed wolf"
else
"Wolf ate sheep"
end
end
end Field ArgumentsField arguments are automatically resolved. A type with a default value becomes optional. A nilable type is also considered a optional type. |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论